/**
 * Proposal template routes — proposal-editor (wave-11 leaf-C).
 * Mounted at /api/proposal-templates in routes/index.ts.
 *
 * GET    /api/proposal-templates         — list all (system + tenant)
 * POST   /api/proposal-templates         — save proposal as template
 * DELETE /api/proposal-templates/:id     — delete tenant-owned template
 */
import { Hono } from 'hono'
import type { AppEnv } from '../types'
import { authMiddleware } from '../middleware/auth'
import { requirePermission } from '../middleware/guards'
import { requireModuleEnabled } from '../middleware/require-module-enabled'
import {
  getProposal,
  listProposalTemplates,
  createProposalTemplate,
  deleteProposalTemplate,
} from '@zync/db/queries'
import { saveProposalTemplateSchema } from '@zync/types'

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

export const proposalTemplatesRoute = new Hono<AppEnv>()

proposalTemplatesRoute.use('*', authMiddleware)

// ── GET /api/proposal-templates ───────────────────────────────────────────────

proposalTemplatesRoute.get(
  '/',
  requireModuleEnabled('marketing'),
  requirePermission('marketing:read'),
  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 items = await listProposalTemplates(db, session.tid)
    return c.json({ items }, 200)
  },
)

// ── POST /api/proposal-templates ─────────────────────────────────────────────

proposalTemplatesRoute.post(
  '/',
  requireModuleEnabled('marketing'),
  requirePermission('marketing: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 = saveProposalTemplateSchema.safeParse(body)
    if (!parsed.success) {
      return c.json({ error: 'Invalid request', issues: parsed.error.issues }, 400)
    }

    const db = c.get('db')
    const sourceProposal = await getProposal(db, session.tid, parsed.data.proposal_id)
    if (!sourceProposal) return c.json({ error: 'Proposal not found' }, 404)

    const template = await createProposalTemplate(db, session.tid, {
      name: parsed.data.name,
      content: sourceProposal.content ?? sourceProposal.lineItems,
      createdBy: session.sub,
    })

    return c.json({ template }, 201)
  },
)

// ── DELETE /api/proposal-templates/:id ───────────────────────────────────────

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

    const id = c.req.param('id')
    const db = c.get('db')
    const deleted = await deleteProposalTemplate(db, session.tid, id)
    if (!deleted) return c.json({ error: 'Not found or is a system template' }, 404)

    return c.body(null, 204)
  },
)
