/**
 * Settings: Projects query helpers — settings-projects (P062).
 *
 * Reads and writes the 8 project-default columns on tenant_settings.
 * These columns are added by the wave-7 integrator migration (tenants.ts
 * is integrator-owned due to 3-way collision).
 *
 * 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'

// ── Domain object type ────────────────────────────────────────────────────────

export interface ProjectSettingsObject {
  project_default_billing_type: 'fixed' | 'hourly' | 'retainer'
  project_default_hourly_rate: number
  project_default_currency: string
  project_default_time_tracking: boolean
  project_default_time_rounding_minutes: 0 | 5 | 15 | 30
  project_default_budget_alert_pct: number
  project_budget_alert_email: boolean
  project_budget_alert_in_app: boolean
}

// ── getProjectSettings ────────────────────────────────────────────────────────

/**
 * Return project default settings for a tenant.
 * Falls back to spec-defined defaults if columns are NULL (migration lag).
 */
export async function getProjectSettings(
  db: Db,
  tenantId: string,
): Promise<ProjectSettingsObject> {
  const [row] = await db
    .select({
      projectDefaultBillingType: tenantSettings.projectDefaultBillingType,
      projectDefaultHourlyRate: tenantSettings.projectDefaultHourlyRate,
      projectDefaultCurrency: tenantSettings.projectDefaultCurrency,
      projectDefaultTimeTracking: tenantSettings.projectDefaultTimeTracking,
      projectDefaultTimeRoundingMinutes: tenantSettings.projectDefaultTimeRoundingMinutes,
      projectDefaultBudgetAlertPct: tenantSettings.projectDefaultBudgetAlertPct,
      projectBudgetAlertEmail: tenantSettings.projectBudgetAlertEmail,
      projectBudgetAlertInApp: tenantSettings.projectBudgetAlertInApp,
    })
    .from(tenantSettings)
    .where(eq(tenantSettings.tenantId, tenantId))
    .limit(1)

  return {
    project_default_billing_type:
      (row?.projectDefaultBillingType as ProjectSettingsObject['project_default_billing_type']) ??
      'fixed',
    project_default_hourly_rate: Number(row?.projectDefaultHourlyRate ?? 0),
    project_default_currency: row?.projectDefaultCurrency ?? 'ILS',
    project_default_time_tracking: row?.projectDefaultTimeTracking ?? true,
    project_default_time_rounding_minutes:
      ((row?.projectDefaultTimeRoundingMinutes ??
        0) as ProjectSettingsObject['project_default_time_rounding_minutes']),
    project_default_budget_alert_pct: row?.projectDefaultBudgetAlertPct ?? 80,
    project_budget_alert_email: row?.projectBudgetAlertEmail ?? true,
    project_budget_alert_in_app: row?.projectBudgetAlertInApp ?? true,
  }
}

// ── updateProjectSettings ─────────────────────────────────────────────────────

import type { ProjectSettingsInput } from '../validation/ticket-sla'

export async function updateProjectSettings(
  db: Db,
  tenantId: string,
  patch: ProjectSettingsInput,
): Promise<ProjectSettingsObject> {
  const setValues: Record<string, unknown> = {}

  if (patch.project_default_billing_type !== undefined)
    setValues['projectDefaultBillingType'] = patch.project_default_billing_type
  if (patch.project_default_hourly_rate !== undefined)
    setValues['projectDefaultHourlyRate'] = String(patch.project_default_hourly_rate)
  if (patch.project_default_currency !== undefined)
    setValues['projectDefaultCurrency'] = patch.project_default_currency
  if (patch.project_default_time_tracking !== undefined)
    setValues['projectDefaultTimeTracking'] = patch.project_default_time_tracking
  if (patch.project_default_time_rounding_minutes !== undefined)
    setValues['projectDefaultTimeRoundingMinutes'] = patch.project_default_time_rounding_minutes
  if (patch.project_default_budget_alert_pct !== undefined)
    setValues['projectDefaultBudgetAlertPct'] = patch.project_default_budget_alert_pct
  if (patch.project_budget_alert_email !== undefined)
    setValues['projectBudgetAlertEmail'] = patch.project_budget_alert_email
  if (patch.project_budget_alert_in_app !== undefined)
    setValues['projectBudgetAlertInApp'] = patch.project_budget_alert_in_app

  if (Object.keys(setValues).length > 0) {
    await db
      .update(tenantSettings)
      .set(setValues as Partial<typeof tenantSettings.$inferInsert>)
      .where(eq(tenantSettings.tenantId, tenantId))
  }

  return getProjectSettings(db, tenantId)
}

// ── Re-export validation schemas ──────────────────────────────────────────────

export { projectSettingsSchema } from '../validation/ticket-sla'
export type { ProjectSettingsInput } from '../validation/ticket-sla'
