/**
 * Task templates CRUD routes — recurring-tasks-templates.
 *
 * All routes run behind authMiddleware + requireModuleEnabled('tasks').
 *
 * GET    /api/task-templates       tasks:read   → TaskTemplateObject[]
 * POST   /api/task-templates       tasks:write  → TaskTemplateObject
 * DELETE /api/task-templates/:id   tasks:write  → { ok: true }
 */
import { Hono } from 'hono'
import type { AppEnv } from '../types'
import { authMiddleware } from '../middleware/auth'
import { requireModuleEnabled } from '../middleware/require-module-enabled'
import { requirePermission } from '../middleware/guards'
import {
  listTaskTemplates,
  createTaskTemplate,
  deleteTaskTemplate,
  createTaskTemplateSchema,
} from '@zync/db/queries'

export const taskTemplatesRoute = new Hono<AppEnv>()

taskTemplatesRoute.use('*', authMiddleware)
taskTemplatesRoute.use('*', requireModuleEnabled('tasks'))

// GET /api/task-templates
taskTemplatesRoute.get('/', requirePermission('tasks:read'), async (c) => {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

  const db = c.get('db')
  const rows = await listTaskTemplates(db, session.tid)
  return c.json({ rows }, 200)
})

// POST /api/task-templates
taskTemplatesRoute.post('/', requirePermission('tasks: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 = createTaskTemplateSchema.safeParse(body)
  if (!parsed.success) {
    return c.json({ error: 'Invalid request', issues: parsed.error.issues }, 422)
  }

  const db = c.get('db')
  const row = await createTaskTemplate(db, session.tid, parsed.data, session.sub)
  return c.json(row, 201)
})

// DELETE /api/task-templates/:id
taskTemplatesRoute.delete('/:id', requirePermission('tasks:write'), async (c) => {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

  const db = c.get('db')
  await deleteTaskTemplate(db, session.tid, c.req.param('id'))
  return c.json({ ok: true }, 200)
})
