/**
 * ITA e-invoice schema — ita-einvoice (wave-10 leaf 5).
 * Postgres / Neon via Hyperdrive.
 *
 * Tables:
 * - einvoice_submissions: per-invoice ITA acknowledgment record.
 *
 * ITA config (API key + business number) is stored encrypted in
 * adapter_credentials using adapter_id = 'einvoice:ita'.
 *
 * DB conventions:
 * - UUID PK .defaultRandom()
 * - TIMESTAMPTZ via timestamp(col, { withTimezone: true })
 * - Enums: text() + check(... IN (...)) — NEVER pgEnum
 */
import {
  pgTable,
  uuid,
  text,
  timestamp,
  index,
  check,
  unique,
} from 'drizzle-orm/pg-core'
import { sql } from 'drizzle-orm'
import { tenants } from './tenants'
import { users } from './users'
import { invoices } from './invoices'

// ── einvoice_submissions ───────────────────────────────────────────────────────
// Records each ITA submission attempt for a given invoice.
// status: 'submitted' | 'failed'

export const einvoiceSubmissions = pgTable(
  'einvoice_submissions',
  {
    id: uuid('id').primaryKey().defaultRandom(),
    tenantId: uuid('tenant_id')
      .notNull()
      .references(() => tenants.id, { onDelete: 'cascade' }),
    invoiceId: uuid('invoice_id')
      .notNull()
      .references(() => invoices.id, { onDelete: 'cascade' }),
    // ITA acknowledgment number returned on successful submission
    ackNumber: text('ack_number'),
    status: text('status').notNull().default('submitted'),
    // Raw error payload from ITA (if failed)
    errorMessage: text('error_message'),
    submittedBy: uuid('submitted_by').references(() => users.id, { onDelete: 'set null' }),
    submittedAt: timestamp('submitted_at', { withTimezone: true }).notNull().defaultNow(),
  },
  (t) => ({
    tenantInvoiceUniq: unique('einvoice_submissions_tenant_invoice_unique').on(
      t.tenantId,
      t.invoiceId,
    ),
    tenantIdx: index('idx_einvoice_submissions_tenant').on(t.tenantId, t.submittedAt.desc()),
    statusCheck: check(
      'einvoice_submissions_status_check',
      sql`${t.status} IN ('submitted','failed')`,
    ),
  }),
)

export type EinvoiceSubmissionRow = typeof einvoiceSubmissions.$inferSelect
export type NewEinvoiceSubmission = typeof einvoiceSubmissions.$inferInsert
