/**
 * Contractor settings query helpers — contractor-settings (wave-11 leaf-E).
 *
 * Reads and writes contractor-related columns from tenant_settings.
 * Routes MUST NOT import raw Drizzle tables — they call these helpers.
 */
import { eq } from 'drizzle-orm'
import type { Db } from '../client'
import { tenantSettings } from '../schema/tenants'
import { auditLog } from './_audit-forward'

// ── Types ──────────────────────────────────────────────────────────────────────

export interface ContractorSettingsDTO {
  contractor_portal_enabled: boolean
  contractor_portal_show_billing: boolean
  contractor_require_time_approval: boolean
  contractor_approval_deadline_days: number
  contractor_payout_period: 'weekly' | 'biweekly' | 'monthly'
  contractor_withholding_note: string | null
}

export interface UpdateContractorSettingsBody {
  contractor_portal_enabled?: boolean
  contractor_portal_show_billing?: boolean
  contractor_require_time_approval?: boolean
  contractor_approval_deadline_days?: number
  contractor_payout_period?: 'weekly' | 'biweekly' | 'monthly'
  contractor_withholding_note?: string | null
}

// ── getContractorSettings ──────────────────────────────────────────────────────

export async function getContractorSettings(
  db: Db,
  tenantId: string,
): Promise<ContractorSettingsDTO> {
  const rows = await db
    .select({
      contractorPortalEnabled: tenantSettings.contractorPortalEnabled,
      contractorPortalShowBilling: tenantSettings.contractorPortalShowBilling,
      contractorRequireTimeApproval: tenantSettings.contractorRequireTimeApproval,
      contractorApprovalDeadlineDays: tenantSettings.contractorApprovalDeadlineDays,
      contractorPayoutPeriod: tenantSettings.contractorPayoutPeriod,
      contractorWithholdingNote: tenantSettings.contractorWithholdingNote,
    })
    .from(tenantSettings)
    .where(eq(tenantSettings.tenantId, tenantId))
    .limit(1)

  const row = rows[0]
  if (!row) {
    return {
      contractor_portal_enabled: true,
      contractor_portal_show_billing: false,
      contractor_require_time_approval: false,
      contractor_approval_deadline_days: 7,
      contractor_payout_period: 'monthly',
      contractor_withholding_note: null,
    }
  }

  return {
    contractor_portal_enabled: row.contractorPortalEnabled,
    contractor_portal_show_billing: row.contractorPortalShowBilling,
    contractor_require_time_approval: row.contractorRequireTimeApproval,
    contractor_approval_deadline_days: row.contractorApprovalDeadlineDays,
    contractor_payout_period: row.contractorPayoutPeriod as 'weekly' | 'biweekly' | 'monthly',
    contractor_withholding_note: row.contractorWithholdingNote ?? null,
  }
}

// ── updateContractorSettings ───────────────────────────────────────────────────

export async function updateContractorSettings(
  db: Db,
  tenantId: string,
  actorId: string,
  patch: UpdateContractorSettingsBody,
): Promise<ContractorSettingsDTO> {
  await db.transaction(async (tx) => {
    await tx
      .update(tenantSettings)
      .set({
        ...(patch.contractor_portal_enabled !== undefined && {
          contractorPortalEnabled: patch.contractor_portal_enabled,
        }),
        ...(patch.contractor_portal_show_billing !== undefined && {
          contractorPortalShowBilling: patch.contractor_portal_show_billing,
        }),
        ...(patch.contractor_require_time_approval !== undefined && {
          contractorRequireTimeApproval: patch.contractor_require_time_approval,
        }),
        ...(patch.contractor_approval_deadline_days !== undefined && {
          contractorApprovalDeadlineDays: patch.contractor_approval_deadline_days,
        }),
        ...(patch.contractor_payout_period !== undefined && {
          contractorPayoutPeriod: patch.contractor_payout_period,
        }),
        ...(patch.contractor_withholding_note !== undefined && {
          contractorWithholdingNote: patch.contractor_withholding_note,
        }),
        updatedAt: new Date(),
      })
      .where(eq(tenantSettings.tenantId, tenantId))

    await tx.insert(auditLog).values({
      tenantId,
      actorId,
      actorType: 'user',
      entityType: 'contractor_settings',
      entityId: tenantId,
      action: 'update',
      changes: null,
    })
  })

  return getContractorSettings(db, tenantId)
}
