import { NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { getSessionUser } from '@/lib/auth'
import { canAccessSurface } from '@/lib/domain/moderator-access'
import { sendEmail, emailDeliveryConfigured } from '@/lib/adapters/email'
import { TEMPLATE_SAMPLE_DATA, renderTemplateClean, sampleDataFor } from '@/lib/email-templates'
import { resolveTemplateMeta } from '@/lib/domain/email-policy'
import { SUPPORT_EMAIL } from '@/lib/app-url'

/**
 * Send a test copy of a template (admin only, §33). Rendered with the sample
 * data, missing rows omitted, sent through the email seam — "recorded" when
 * no provider is configured. Nothing is stored; nothing leaves for anyone
 * but the address the admin typed.
 */
const schema = z.object({
  key: z.string().trim().min(1).max(80),
  subject: z.string().trim().min(1).max(300),
  body: z.string().trim().min(1).max(20_000),
  to: z.string().trim().email().max(200),
  footer: z.string().trim().max(2000).optional().or(z.literal('')),
  support_contact: z.string().trim().max(200).optional().or(z.literal('')),
  cta_text: z.string().trim().max(120).optional().or(z.literal('')),
})

export async function POST(req: NextRequest) {
  const user = await getSessionUser()
  if (!user || !canAccessSurface(user, 'email_templates')) return NextResponse.json({ error: 'You do not have access to this page.' }, { status: 403 })
  const parsed = schema.safeParse(await req.json().catch(() => ({})))
  if (!parsed.success) return NextResponse.json({ error: 'A valid address, subject and body are required.' }, { status: 400 })
  const input = parsed.data
  const data = {
    ...sampleDataFor(input.key),
    company_footer: input.footer || TEMPLATE_SAMPLE_DATA.company_footer,
    support_email: input.support_contact || SUPPORT_EMAIL,
    approve_button: `${input.cta_text || 'Approve request'} → ${TEMPLATE_SAMPLE_DATA.approve_link ?? ''}`,
  }
  const subject = `[TEST] ${renderTemplateClean(input.subject, data)}`
  const text = renderTemplateClean(input.body, data)
  const stream = resolveTemplateMeta(input.key).stream
  const r = await sendEmail({ to: input.to, subject, text, stream, tags: { kind: 'template_test', template: input.key } })
  return NextResponse.json({ ok: true, status: r.status, stream, agent: r.agent, configured: emailDeliveryConfigured(stream), error: r.status === 'failed' ? r.error : null, subject })
}
