/**
 * Dunning schedule settings routes — payment-retry-dunning (wave-11).
 * Mounted at /api/settings/dunning.
 *
 * GET    / → list dunning schedules
 * PUT    / → upsert a dunning schedule step
 * DELETE /:offsetDays → remove a schedule step
 */
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,
  listDunningSchedules,
  upsertDunningSchedule,
  deleteDunningSchedule,
  upsertDunningScheduleSchema,
} from '@zync/db/queries'

export const dunningSettingsRoute = new Hono<AppEnv>()

dunningSettingsRoute.use('*', authMiddleware)

// GET /api/settings/dunning
dunningSettingsRoute.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 schedules = await listDunningSchedules(db, session.tid)
  return c.json({ schedules }, 200)
})

// PUT /api/settings/dunning
dunningSettingsRoute.put('/', 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 = upsertDunningScheduleSchema.safeParse(body)
  if (!parsed.success) {
    return c.json({ error: 'Validation failed', issues: parsed.error.issues }, 400)
  }

  const db = createDb(c.env)
  const schedule = await upsertDunningSchedule(db, session.tid, parsed.data)
  return c.json(schedule, 200)
})

// DELETE /api/settings/dunning/:offsetDays
dunningSettingsRoute.delete(
  '/:offsetDays',
  requirePermission('settings:write'),
  async (c) => {
    const session = c.get('session')
    if (!session || session.type !== 'user' || !session.tid) {
      return c.json({ error: 'Unauthorized' }, 401)
    }

    const offsetDaysStr = c.req.param('offsetDays')
    const parsed = z.coerce.number().int().min(1).safeParse(offsetDaysStr)
    if (!parsed.success) {
      return c.json({ error: 'Invalid offsetDays' }, 400)
    }

    const db = createDb(c.env)
    await deleteDunningSchedule(db, session.tid, parsed.data)
    return c.json({ ok: true }, 200)
  },
)
