/**
 * ITA e-invoice settings routes — ita-einvoice (wave-10 leaf 5).
 * Mounted at /api/settings/einvoice.
 *
 * GET  / → { configured, businessNumber, autoSubmit }
 * PATCH / → update ITA config (encrypt API key)
 *
 * Guarded by authMiddleware + settings:write permission on PATCH.
 * PATCH writes an audit log row in the same transaction (via query helper).
 */
import { Hono } from 'hono'
import type { AppEnv } from '../../types'
import { authMiddleware } from '../../middleware/auth'
import { requirePermission } from '../../middleware/guards'
import {
  createDb,
  getEinvoiceConfigSummary,
  updateEinvoiceConfig,
  updateEinvoiceConfigSchema,
} from '@zync/db/queries'
import { logAuditEvent } from '@zync/db/queries'

// ── Zod schemas ────────────────────────────────────────────────────────────────

const patchEinvoiceSchema = updateEinvoiceConfigSchema

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

export const einvoiceSettingsRoute = new Hono<AppEnv>()

einvoiceSettingsRoute.use('*', authMiddleware)

// GET /api/settings/einvoice
einvoiceSettingsRoute.get('/', async (c) => {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

  const db = c.get('db') ?? createDb(c.env)
  const summary = await getEinvoiceConfigSummary(db, session.tid)

  if (!summary) {
    return c.json(
      { configured: false, businessNumber: '', autoSubmit: false },
      200,
    )
  }

  return c.json(summary, 200)
})

// PATCH /api/settings/einvoice
einvoiceSettingsRoute.patch(
  '/',
  requirePermission('settings:write'),
  async (c) => {
    const session = c.get('session')
    if (!session || session.type !== 'user' || !session.tid) {
      return c.json({ error: 'Unauthorized' }, 401)
    }

    const body = await c.req.json().catch(() => null)
    const parsed = patchEinvoiceSchema.safeParse(body)
    if (!parsed.success) {
      return c.json({ error: 'Validation failed', issues: parsed.error.issues }, 400)
    }

    const db = c.get('db') ?? createDb(c.env)
    await updateEinvoiceConfig(db, session.tid, session.sub, parsed.data)

    await logAuditEvent(c, {
      tenantId: session.tid,
      userId: session.sub,
      entityType: 'einvoice_config',
      entityId: session.tid,
      eventType: 'settings.updated',
      metadata: { field: 'einvoice_business_number', new_value: parsed.data.businessNumber },
    })

    const updated = await getEinvoiceConfigSummary(db, session.tid)
    return c.json(updated ?? { configured: false, businessNumber: '', autoSubmit: false }, 200)
  },
)
