/**
 * Per-diem expense service — expenses-module.
 * Creates receipt-less daily allowance expenses.
 * Per-diem expenses: vat_amount=0, vat_deductible=false, status=COMPLETED, no OCR.
 */
import type { Db } from '@zync/db/queries'
import { assertTenantOwnsOrThrow, assertTenantOwnsProject, resolveApprovalStatus } from '@zync/db/queries'
import type { PerDiemRates } from '@zync/types'
import { getExpenseSettings } from './settings'
import { createExpense } from './service'

export interface PerDiemInput {
  travel_type: 'domestic' | 'international'
  days: number
  date: string  // YYYY-MM-DD
  project_id?: string
  notes?: string
}

/** Compute per-diem rate + ILS amount per spec tier rules. */
export function computePerDiemAmount(
  travelType: 'domestic' | 'international',
  days: number,
  rates: PerDiemRates,
): { rate: number; amount: number } {
  if (days === 0.5) {
    const rate =
      travelType === 'domestic' ? rates.domestic_half_day : rates.international_half_day
    return { rate, amount: rate }
  }
  if (days === 1) {
    const rate =
      travelType === 'domestic' ? rates.domestic_full_day : rates.international_full_day
    return { rate, amount: rate }
  }
  const rate =
    travelType === 'domestic' ? rates.domestic_full_day : rates.international_full_day
  return { rate, amount: rate * days }
}

export async function createPerDiemExpense(
  db: Db,
  tenantId: string,
  userId: string,
  input: PerDiemInput,
  tier: string,
): Promise<{ expenseId: string }> {
  const settings = await getExpenseSettings(db, tenantId)
  const rates = settings.per_diem_rates
  const { rate, amount } = computePerDiemAmount(input.travel_type, input.days, rates)

  assertTenantOwnsOrThrow(
    'project_id',
    await assertTenantOwnsProject(db, tenantId, input.project_id),
  )

  const approvalStatus = await resolveApprovalStatus({
    tenantId,
    amount,
    tier,
    db,
  })

  const expense = await createExpense(db, tenantId, {
    tenantId,
    createdBy: userId,
    r2Key: '',
    fileName: `per-diem-${input.date}.txt`,
    fileType: 'pdf',
    fileSizeBytes: 0,
    source: 'upload',
    isPerDiem: true,
    perDiemDays: String(input.days),
    perDiemRateIls: String(rate),
    expenseCategory: 'travel',
    vatAmount: '0',
    vatDeductible: false,
    amount: String(amount),
    expenseDate: input.date,
    projectId: input.project_id ?? null,
    notes: input.notes ?? null,
    status: 'COMPLETED',
    approvalStatus,
  })

  return { expenseId: expense.id }
}
