/**
 * Lead scoring routes — lead-qualification-scoring (wave-14).
 * Mounted under the existing leads router:
 *
 *   POST /api/marketing/leads/:id/score  — sync recalculate (marketing:write)
 *   GET  /api/marketing/leads/:id/score  — read score + breakdown (marketing:read)
 *   GET  /api/marketing/settings/crm/lead-scoring  — read tenant criteria (settings:read)
 *   PUT  /api/marketing/settings/crm/lead-scoring  — update criteria (settings:write)
 *
 * Business+ tier gate applied to all score endpoints.
 */
import { Hono } from 'hono'
import { createDb, computeAndSaveLeadScore, getLeadScoreBreakdown, getLead, getLeadScoringCriteria, upsertLeadScoringCriteria, leadScoringCriteriaSchema } from '@zync/db/queries'
import type { AppEnv } from '../../types'
import { requirePermission, requireTier } from '../../middleware/guards'
import { TenantTier } from '@zync/types'

export const leadScoreRoute = new Hono<AppEnv>()

// POST /api/marketing/leads/:id/score — recalculate synchronously
leadScoreRoute.post(
  '/:id/score',
  requirePermission('marketing:write'),
  requireTier(TenantTier.BUSINESS),
  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()
    const db = createDb(c.env)

    const lead = await getLead(db, session.tid, id)
    if (!lead) return c.json({ error: 'Not found' }, 404)

    const result = await computeAndSaveLeadScore(db, session.tid, id)
    return c.json({ score: result.score, breakdown: result.breakdown })
  },
)

// GET /api/marketing/leads/:id/score — read score + breakdown
leadScoreRoute.get(
  '/:id/score',
  requirePermission('marketing:read'),
  requireTier(TenantTier.BUSINESS),
  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()
    const db = createDb(c.env)

    const lead = await getLead(db, session.tid, id)
    if (!lead) return c.json({ error: 'Not found' }, 404)

    const result = await getLeadScoreBreakdown(db, session.tid, id)
    return c.json({
      score: result.score,
      breakdown: result.breakdown,
      scoreUpdatedAt: result.scoreUpdatedAt?.toISOString() ?? null,
    })
  },
)

// ── Settings endpoints (mounted at /api/marketing/settings/crm) ────────────────

export const leadScoringSettingsRoute = new Hono<AppEnv>()

// GET /api/marketing/settings/crm/lead-scoring
leadScoringSettingsRoute.get(
  '/',
  requirePermission('settings:read'),
  requireTier(TenantTier.BUSINESS),
  async (c) => {
    const session = c.get('session')
    if (!session || session.type !== 'user' || !session.tid) return c.json({ error: 'Unauthorized' }, 401)
    const db = createDb(c.env)
    const criteria = await getLeadScoringCriteria(db, session.tid)
    return c.json({ criteria })
  },
)

// PUT /api/marketing/settings/crm/lead-scoring
leadScoringSettingsRoute.put(
  '/',
  requirePermission('settings:write'),
  requireTier(TenantTier.BUSINESS),
  async (c) => {
    const session = c.get('session')
    if (!session || session.type !== 'user' || !session.tid) return c.json({ error: 'Unauthorized' }, 401)
    const db = createDb(c.env)

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

    const criteria = await upsertLeadScoringCriteria(db, session.tid, parsed.data)
    return c.json({ criteria })
  },
)
