/**
 * Expense settings contract — expenses-module (canonical, single declaration).
 *
 * Imported by:
 *   - wave-4 settings route (Task 11) for GET/PATCH /api/settings/expenses
 *   - wave-10 expense-settings-ui page (spec 62) for /settings/expenses
 *
 * Neither consumer redefines ExpenseSettings, expenseSettingsSchema, or
 * mergeExpenseSettings — this is the single source of truth.
 *
 * Currency: NOT here — tenants.default_currency scalar (system-i18n).
 * advance_tax_rate_pct: NOT here — owned by israeli-tax-reports (spec 171).
 */
import { z } from 'zod'
import { EXPENSE_CATEGORY_IDS } from './expense-categories'
import type { ExpenseSettings, PerDiemRates } from './expenses'

export type { ExpenseSettings, PerDiemRates }
export type FilingCadence = 'monthly' | 'bimonthly'

/**
 * Full-row defaults matching the tenant_settings column DEFAULTs.
 * getExpenseSettings coalesces stored rows through mergeExpenseSettings
 * so callers always receive a complete ExpenseSettings object.
 */
export const EXPENSE_SETTINGS_DEFAULTS: ExpenseSettings = {
  filing_cadence: 'monthly',
  tax_basis: 'cash',
  business_category: null,
  per_diem_rates: {
    domestic_full_day: 100,
    domestic_half_day: 50,
    international_full_day: 250,
    international_half_day: 125,
  },
  expense_default_category: 'exceptional',
  expense_auto_approve_threshold_ils: 0,
  expense_receipt_reminder_enabled: false,
  expense_receipt_reminder_days: 7,
  expense_approval_threshold_ils: 0,
  expense_approver_role: 'any_admin',
}

/**
 * Page-editable PATCH subset submitted by /settings/expenses.
 * .strict() rejects unknown keys. tax_basis + business_category are NOT
 * page-editable (set at onboarding/AI-context) — intentionally absent.
 */
export const expenseSettingsSchema = z
  .object({
    expense_default_category: z.enum([
      ...EXPENSE_CATEGORY_IDS,
      'other',
    ] as unknown as [string, ...string[]]),
    expense_auto_approve_threshold_ils: z.number().int().min(0),
    filing_cadence: z.enum(['monthly', 'bimonthly']),
    expense_receipt_reminder_enabled: z.boolean(),
    expense_receipt_reminder_days: z.number().int().min(1).max(365),
    expense_approval_threshold_ils: z.number().int().min(0),
    expense_approver_role: z.union([z.literal('any_admin'), z.string().uuid()]),
    per_diem_rates: z.object({
      domestic_full_day: z.number().min(0),
      domestic_half_day: z.number().min(0),
      international_full_day: z.number().min(0),
      international_half_day: z.number().min(0),
    }),
  })
  .strict()

export type ExpenseSettingsPatch = z.infer<typeof expenseSettingsSchema>

/**
 * Merge a possibly-partial stored row over the full defaults.
 * Always returns a complete ExpenseSettings.
 */
export function mergeExpenseSettings(
  stored: Partial<ExpenseSettings> | null | undefined,
): ExpenseSettings {
  return {
    ...EXPENSE_SETTINGS_DEFAULTS,
    ...(stored ?? {}),
    per_diem_rates: {
      ...EXPENSE_SETTINGS_DEFAULTS.per_diem_rates,
      ...(stored?.per_diem_rates ?? {}),
    },
  }
}
