/**
 * Invoice dunning routes — payment-retry-dunning (wave-11).
 * Mounted under invoice router.
 *
 * GET    /api/invoices/:id/dunning → dunning log for an invoice
 * POST   /api/invoices/:id/dunning/remind → send manual reminder (offset_days = -1)
 */
import { Hono } from 'hono'
import type { AppEnv } from '../../types'
import { authMiddleware } from '../../middleware/auth'
import { requirePermission } from '../../middleware/guards'
import {
  createDb,
  listDunningLog,
  appendDunningLog,
} from '@zync/db/queries'

export const invoiceDunningRoutes = new Hono<AppEnv>()

invoiceDunningRoutes.use('*', authMiddleware)

// GET /api/invoices/:id/dunning
invoiceDunningRoutes.get(
  '/:id/dunning',
  requirePermission('invoices:read'),
  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 = createDb(c.env)
    const log = await listDunningLog(db, session.tid, invoiceId)
    return c.json({ log }, 200)
  },
)

// POST /api/invoices/:id/dunning/remind
invoiceDunningRoutes.post(
  '/:id/dunning/remind',
  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 = createDb(c.env)

    // offset_days = -1 marks manual reminder
    const entry = await appendDunningLog(db, session.tid, {
      invoiceId,
      offsetDays: -1,
      action: 'email_reminder',
      result: 'sent',
    })

    return c.json(entry, 201)
  },
)
