/**
 * Invoice payment reminders settings routes — invoice-payment-reminders (wave-13).
 * Mounted at /api/settings/invoicing/reminders.
 *
 * GET  / → return { enabled, schedule }
 * PATCH / → update reminder settings (requires settings:write)
 */
import { Hono } from 'hono'
import { z } from 'zod'
import type { AppEnv } from '../../types'
import { authMiddleware } from '../../middleware/auth'
import { requirePermission } from '../../middleware/guards'
import {
  createDb,
  getTenantReminderSettings,
  updateTenantReminderSettings,
} from '@zync/db/queries'

// ── Zod schemas ───────────────────────────────────────────────────────────────

const scheduleStageSchema = z.object({
  offset_days: z.number().int(),
  enabled: z.boolean(),
})

const patchReminderSettingsSchema = z.object({
  enabled: z.boolean(),
  schedule: z.array(scheduleStageSchema).min(1).max(20),
})

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

export const invoicingRemindersSettingsRoute = new Hono<AppEnv>()

invoicingRemindersSettingsRoute.use('*', authMiddleware)

// GET /api/settings/invoicing/reminders
invoicingRemindersSettingsRoute.get('/', requirePermission('settings:read'), 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 settings = await getTenantReminderSettings(db, session.tid)
  return c.json(settings, 200)
})

// PATCH /api/settings/invoicing/reminders
invoicingRemindersSettingsRoute.patch('/', requirePermission('settings: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 = patchReminderSettingsSchema.safeParse(body)
  if (!parsed.success) {
    return c.json({ error: 'Validation failed', issues: parsed.error.issues }, 400)
  }

  const db = createDb(c.env)
  const updated = await updateTenantReminderSettings(db, session.tid, {
    enabled: parsed.data.enabled,
    schedule: parsed.data.schedule,
  })
  return c.json(updated, 200)
})
