/**
 * ITA e-invoice invoice routes — ita-einvoice (wave-10 leaf 5).
 * Mounted at /api/invoices (sub-routes of the invoices router).
 *
 * POST /:id/submit-einvoice → submit invoice to ITA, store ack number
 *
 * Guarded by authMiddleware + invoices:write permission.
 */
import { Hono } from 'hono'
import type { AppEnv } from '../../types'
import { requirePermission } from '../../middleware/guards'
import {
  createDb,
  getInvoiceWithLines,
  getEinvoiceConfig,
  getEinvoiceStatus,
  markInvoiceAsSubmitted,
  logAuditEvent,
} from '@zync/db/queries'
import { submitInvoice } from '../../integrations/ita-einvoice'

// ── Router ─────────────────────────────────────────────────────────────────────

export const einvoiceInvoiceRoutes = new Hono<AppEnv>()

// POST /api/invoices/:id/submit-einvoice
einvoiceInvoiceRoutes.post(
  '/:id/submit-einvoice',
  requirePermission('invoices:write'),
  async (c) => {
    const session = c.get('session')
    if (!session || session.type !== 'user' || !session.tid) {
      return c.json({ error: 'Unauthorized' }, 401)
    }

    const invoiceId = c.req.param('id')
    const db = c.get('db') ?? createDb(c.env)

    // Check ITA configured
    const itaConfig = await getEinvoiceConfig(db, session.tid)
    if (!itaConfig) {
      return c.json({ error: 'ITA e-invoice not configured. Go to Settings → E-Invoice.' }, 422)
    }

    // Load invoice
    const invoice = await getInvoiceWithLines(db, session.tid, invoiceId)
    if (!invoice) {
      return c.json({ error: 'Invoice not found' }, 404)
    }

    // Only TAX_ISSUED or PAID invoices can be submitted
    if (invoice.status !== 'TAX_ISSUED' && invoice.status !== 'PAID') {
      return c.json(
        { error: 'Invoice must be in TAX_ISSUED or PAID status for ITA submission' },
        422,
      )
    }

    // Check if already submitted
    const existing = await getEinvoiceStatus(db, session.tid, invoiceId)
    if (existing.submitted) {
      return c.json(
        {
          ackNumber: existing.ackNumber,
          submittedAt: existing.submittedAt,
          status: existing.status,
          alreadySubmitted: true,
        },
        200,
      )
    }

    // Submit to ITA
    const result = await submitInvoice(
      { apiKey: itaConfig.apiKey, businessNumber: itaConfig.businessNumber },
      {
        invoiceId: invoice.id,
        invoiceNumber: invoice.invoiceNumber,
        vatRegNumber: itaConfig.businessNumber,
        amount: invoice.total,
        vatAmount: invoice.vatAmount ?? '0',
        currency: invoice.currency,
        issueDate: invoice.taxIssueDate ?? invoice.issueDate ?? new Date().toISOString().slice(0, 10),
        customerName: invoice.customerId ?? '', // customer UUID — ITA receives VAT reg number separately
        lines: (invoice.lines ?? []).map((l) => ({
          description: l.description,
          quantity: parseFloat(l.quantity),
          unitPrice: l.unitPrice,
          taxable: l.taxable,
        })),
      },
    )

    if (!result.success) {
      return c.json({ error: result.error }, 502)
    }

    // Persist ack
    await markInvoiceAsSubmitted(db, session.tid, session.sub, invoiceId, result.ackNumber)

    await logAuditEvent(c, {
      tenantId: session.tid,
      userId: session.sub,
      entityType: 'invoice',
      entityId: invoiceId,
      eventType: 'einvoice.submitted',
      metadata: { ack_number: result.ackNumber },
    })

    return c.json({ ackNumber: result.ackNumber, submittedAt: result.submittedAt }, 200)
  },
)
