/**
 * Invoice Approval Workflow routes — invoice-approval-workflow (P054).
 * Mounted at /api/invoices/approvals in apps/zync-api/src/routes/index.ts.
 *
 * Routes (relative to mount point /api/invoices/approvals):
 *   GET  /             → list SENT invoices awaiting approval (paginated)
 *   GET  /count        → count of pending approvals (for sidebar badge)
 *
 * Related routes that live in the core invoices router (routes/invoices/index.ts):
 *   POST /api/invoices/bulk-approve → bulk approve multiple invoices
 *   POST /api/invoices/:id/approve  → call approveInvoiceEnhanced
 *   POST /api/invoices/:id/reject   → call rejectInvoiceEnhanced
 */
import { Hono } from 'hono'
import type { AppEnv } from '../../types'
import { authMiddleware } from '../../middleware/auth'
import { requireModuleEnabled } from '../../middleware/require-module-enabled'
import { requirePermission } from '../../middleware/guards'
import {
  listPendingApprovals,
  listPendingApprovalsSchema,
  countPendingApprovals,
} from '@zync/db/queries'

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

export const invoiceApprovalRoutes = new Hono<AppEnv>()

invoiceApprovalRoutes.use('*', authMiddleware)
invoiceApprovalRoutes.use('*', requireModuleEnabled('invoices'))

// ── GET /api/invoices/approvals ───────────────────────────────────────────────
// List all SENT invoices awaiting approval (paginated, sortable, searchable).

invoiceApprovalRoutes.get('/', requirePermission('invoices:write'), async (c) => {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

  const query = c.req.query()
  const parsed = listPendingApprovalsSchema.safeParse({
    search: query.search,
    sort: query.sort,
    page: query.page,
    perPage: query.per_page ?? query.perPage,
  })

  if (!parsed.success) {
    return c.json({ error: 'Validation failed', issues: parsed.error.issues }, 400)
  }

  const db = c.get('db')
  const result = await listPendingApprovals(db, session.tid, parsed.data)
  return c.json(result, 200)
})

// ── GET /api/invoices/approvals/count ─────────────────────────────────────────
// Lightweight endpoint for the sidebar badge count.

invoiceApprovalRoutes.get('/count', requirePermission('invoices:write'), 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')
  const total = await countPendingApprovals(db, session.tid)
  return c.json({ total }, 200)
})
