/**
 * Recurring tasks CRUD routes — recurring-tasks-templates.
 *
 * Mounted inside the tasks module group (behind authMiddleware + requireModuleEnabled('tasks')).
 *
 * GET    /recurring        tasks:read   → RecurringTaskObject[]
 * POST   /recurring        tasks:write  → RecurringTaskObject
 * PATCH  /recurring/:id    tasks:write  → RecurringTaskObject
 * DELETE /recurring/:id    tasks:write  → { ok: true }
 */
import { Hono } from 'hono'
import type { AppEnv } from '../../types'
import { requirePermission } from '../../middleware/guards'
import {
  listRecurringTasks,
  createRecurringTask,
  updateRecurringTask,
  deleteRecurringTask,
  createRecurringTaskSchema,
  updateRecurringTaskSchema,
  assertTenantOwnsProject,
  assertActiveTenantAssignee,
  assertTenantOwnsTaskStatus,
  invalidTenantReferenceBody,
} from '@zync/db/queries'

export const recurringTasksRoute = new Hono<AppEnv>()

// GET /api/tasks/recurring
recurringTasksRoute.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 listRecurringTasks(db, session.tid)
  return c.json({ rows }, 200)
})

// POST /api/tasks/recurring
recurringTasksRoute.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 = createRecurringTaskSchema.safeParse(body)
  if (!parsed.success) {
    return c.json({ error: 'Invalid request', issues: parsed.error.issues }, 422)
  }

  const db = c.get('db')

  if (!(await assertTenantOwnsProject(db, session.tid, parsed.data.project_id))) {
    return c.json(invalidTenantReferenceBody('project_id'), 400)
  }
  if (!(await assertActiveTenantAssignee(db, session.tid, parsed.data.assignee_id))) {
    return c.json(invalidTenantReferenceBody('assignee_id'), 400)
  }
  if (!(await assertTenantOwnsTaskStatus(db, session.tid, parsed.data.status_id))) {
    return c.json(invalidTenantReferenceBody('status_id'), 400)
  }

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

// PATCH /api/tasks/recurring/:id
recurringTasksRoute.patch('/: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 body = await c.req.json().catch(() => null)
  const parsed = updateRecurringTaskSchema.safeParse(body)
  if (!parsed.success) {
    return c.json({ error: 'Invalid request', issues: parsed.error.issues }, 422)
  }

  const db = c.get('db')

  if (parsed.data.project_id !== undefined) {
    if (!(await assertTenantOwnsProject(db, session.tid, parsed.data.project_id))) {
      return c.json(invalidTenantReferenceBody('project_id'), 400)
    }
  }
  if (parsed.data.assignee_id !== undefined) {
    if (!(await assertActiveTenantAssignee(db, session.tid, parsed.data.assignee_id))) {
      return c.json(invalidTenantReferenceBody('assignee_id'), 400)
    }
  }
  if (parsed.data.status_id !== undefined) {
    if (!(await assertTenantOwnsTaskStatus(db, session.tid, parsed.data.status_id))) {
      return c.json(invalidTenantReferenceBody('status_id'), 400)
    }
  }

  const row = await updateRecurringTask(db, session.tid, c.req.param('id'), parsed.data)
  return c.json(row, 200)
})

// DELETE /api/tasks/recurring/:id
recurringTasksRoute.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 deleteRecurringTask(db, session.tid, c.req.param('id'))
  return c.json({ ok: true }, 200)
})
