/**
 * Send sequence emails cron — email-marketing-sequences (wave-10 leaf 6).
 *
 * POST /api/cron/send-sequence-emails
 *
 * Guarded by CRON_SECRET (timing-safe comparison).
 * Schedule: `0 8 * * *` (daily at 08:00 UTC).
 * Add to wrangler.toml [triggers] crons array:
 *   "0 8 * * *",  # send-sequence-emails — daily at 08:00 UTC
 *
 * Algorithm:
 *   1. Query active enrollments with nextSendAt <= now across all tenants.
 *   2. For each enrollment, log the "send" action (email adapter hook point).
 *   3. Advance enrollment to next step (or mark completed).
 *   4. Per-enrollment errors are caught so one failure doesn't abort the run.
 */
import { Hono } from 'hono'
import { timingSafeEqual } from '@zync/auth'
import {
  createDb,
  advanceEnrollment,
  listSequenceSteps,
  getAllDueEnrollments,
} from '@zync/db/queries'
import type { AppEnv } from '../../types'

export const sendSequenceEmailsCron = new Hono<AppEnv>()

sendSequenceEmailsCron.post('/', async (c) => {
  // ── CRON_SECRET guard ──────────────────────────────────────────────────────
  const secret = c.req.header('x-cron-secret') ?? ''
  const expected = c.env.CRON_SECRET
  if (!expected || expected.length < 16) {
    return c.json({ error: 'Server misconfigured' }, 500)
  }

  if (!timingSafeEqual(secret, expected)) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

  const db = createDb(c.env)

  const dueEnrollments = await getAllDueEnrollments(db)

  let sent = 0
  let failed = 0
  const errors: string[] = []

  for (const enrollment of dueEnrollments) {
    try {
      // Load steps to find which one to send now
      const steps = await listSequenceSteps(db, enrollment.tenantId, enrollment.sequenceId)
      const currentStep = steps.find((s) => s.stepNumber === enrollment.currentStep + 1)
        ?? steps[enrollment.currentStep]

      if (currentStep) {
        // Production: plug in SMTP/SES adapter here.
        // For now, log the intended send action.
        console.log(
          `[sequence-email] tenant=${enrollment.tenantId} enrollment=${enrollment.id}` +
          ` to=${enrollment.contactEmail} subject="${currentStep.subject}"`,
        )
      }

      // Advance to next step (or complete)
      await advanceEnrollment(db, enrollment.tenantId, enrollment.id)
      sent++
    } catch (err) {
      failed++
      errors.push(`enrollment ${enrollment.id}: ${err instanceof Error ? err.message : String(err)}`)
    }
  }

  return c.json({
    ok: true,
    processed: dueEnrollments.length,
    sent,
    failed,
    errors: errors.slice(0, 20),
  })
})
