/**
 * Chart-of-accounts defaults — accountant-export (wave-15).
 *
 * Provides `seedDefaultChartOfAccounts(env, tenantId)` that inserts
 * default Israeli CoA rows idempotently when a tenant first accesses
 * the accounting integration (called by GET /api/coa/accounts when no rows exist).
 *
 * Default accounts:
 *  1000  bank           asset
 *  1100  A/R            asset
 *  1200  VAT input      asset
 *  2100  A/P            liability
 *  2200  VAT payable    liability
 *  2300  withholding    liability
 *  3000  equity         equity
 *  4000  revenue        revenue
 *  4900  inventory/cogs expense   (inventory_stock)
 *  5000  office exp     expense   (office)
 *  5010  professional   expense   (professional / contractors)
 *  5020  marketing      expense   (marketing)
 *  5030  vehicle        expense   (vehicle)
 *  5040  equipment      expense   (equipment)
 *  5050  finance        expense   (finance)
 *  5060  welfare        expense   (welfare)
 *  5070  exceptional    expense   (exceptional)
 *  5080  travel         expense   (travel)
 *
 * Form 6111 P&L field codes (ITA טופס 6111):
 *   Source: gov.il/he/service/itc6111 + official "דברי הסבר לטופס 6111".
 *   These are best-effort seed defaults; the external accountant verifies and
 *   refines exact codes via the editable CoA UI (PUT /api/coa/accounts).
 *   Balance-sheet accounts (asset/liability/equity) are excluded from the v1
 *   P&L section — form6111Code is NULL for those rows.
 */

import { createDb, coaAccounts, coaMappings } from '@zync/db/queries'
import type { Env } from '@zync/types'

type NewAccount = {
  code: string
  name: string
  type: 'asset' | 'liability' | 'equity' | 'revenue' | 'expense'
  form6111Code?: string
}

const DEFAULT_ACCOUNTS: NewAccount[] = [
  { code: '1000', name: 'בנק', type: 'asset' },
  { code: '1100', name: 'לקוחות - חשבונות לגבות', type: 'asset' },
  { code: '1200', name: 'מע"מ תשומות', type: 'asset' },
  { code: '2100', name: 'ספקים - חשבונות לשלם', type: 'liability' },
  { code: '2200', name: 'מע"מ עסקאות לשלם', type: 'liability' },
  { code: '2300', name: 'ניכוי מס במקור לשלם', type: 'liability' },
  { code: '3000', name: 'הון עצמי', type: 'equity' },
  { code: '4000', name: 'הכנסות', type: 'revenue', form6111Code: '1300' },
  { code: '4900', name: 'מלאי / עלות המכר', type: 'expense', form6111Code: '2000' },
  { code: '5000', name: 'הוצאות משרד', type: 'expense', form6111Code: '5000' },
  { code: '5010', name: 'שירותים מקצועיים', type: 'expense', form6111Code: '5000' },
  { code: '5020', name: 'שיווק ופרסום', type: 'expense', form6111Code: '3500' },
  { code: '5030', name: 'רכב ונסיעות', type: 'expense', form6111Code: '5000' },
  { code: '5040', name: 'ציוד וחומרה', type: 'expense', form6111Code: '5000' },
  { code: '5050', name: 'עלויות פיננסיות', type: 'expense', form6111Code: '5000' },
  { code: '5060', name: 'רווחה לעובדים', type: 'expense', form6111Code: '5000' },
  { code: '5070', name: 'הוצאות חריגות', type: 'expense', form6111Code: '5000' },
  { code: '5080', name: 'נסיעות לחוץ לארץ', type: 'expense', form6111Code: '5000' },
]

// source_kind → default account code
const DEFAULT_MAPPINGS: Array<{ sourceKind: string; accountCode: string }> = [
  { sourceKind: 'revenue', accountCode: '4000' },
  { sourceKind: 'ar', accountCode: '1100' },
  { sourceKind: 'bank', accountCode: '1000' },
  { sourceKind: 'vat_payable', accountCode: '2200' },
  { sourceKind: 'vat_input', accountCode: '1200' },
  { sourceKind: 'ap', accountCode: '2100' },
  { sourceKind: 'withholding', accountCode: '2300' },
  { sourceKind: 'inventory_stock', accountCode: '4900' },
  // expense categories from expenses-module check constraint
  { sourceKind: 'office', accountCode: '5000' },
  { sourceKind: 'professional', accountCode: '5010' },
  { sourceKind: 'marketing', accountCode: '5020' },
  { sourceKind: 'vehicle', accountCode: '5030' },
  { sourceKind: 'equipment', accountCode: '5040' },
  { sourceKind: 'finance', accountCode: '5050' },
  { sourceKind: 'welfare', accountCode: '5060' },
  { sourceKind: 'exceptional', accountCode: '5070' },
  { sourceKind: 'travel', accountCode: '5080' },
]

/**
 * Insert default chart of accounts + category mappings for a tenant.
 * Idempotent: uses INSERT ... ON CONFLICT DO NOTHING via Drizzle onConflictDoNothing.
 */
export async function seedDefaultChartOfAccounts(env: Env, tenantId: string): Promise<void> {
  const db = createDb(env)

  await db
    .insert(coaAccounts)
    .values(
      DEFAULT_ACCOUNTS.map((a) => ({
        tenantId,
        code: a.code,
        name: a.name,
        type: a.type,
        form6111Code: a.form6111Code ?? null,
      })),
    )
    .onConflictDoNothing()

  await db
    .insert(coaMappings)
    .values(
      DEFAULT_MAPPINGS.map((m) => ({
        tenantId,
        sourceKind: m.sourceKind,
        accountCode: m.accountCode,
      })),
    )
    .onConflictDoNothing()
}
