/**
 * Project Gantt routes — project-gantt (wave-8 leaf 6).
 * Mounted at /api/projects via projectRoutes.
 *
 * Routes:
 *   GET    /:id/gantt                     → gantt data (project + milestones + tasks)
 *   PATCH  /:id/milestones/:mid/dates     → update milestone due_date
 *   PATCH  /:id/tasks/:tid/dates          → update task due_date
 */
import { Hono } from 'hono'
import { z } from 'zod'
import type { AppEnv } from '../../types'
import { requirePermission } from '../../middleware/guards'
import {
  getProjectGanttData,
  updateMilestoneDueDate,
  updateTaskDueDate,
} from '@zync/db/queries'

const updateDatesSchema = z.object({
  due_date: z.string().date().nullable().optional(),
})

export const projectGanttRoutes = new Hono<AppEnv>()

// GET /api/projects/:id/gantt
projectGanttRoutes.get('/:id/gantt', requirePermission('projects:read'), async (c) => {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

  const projectId = c.req.param('id')
  const db = c.get('db')
  const data = await getProjectGanttData(db, session.tid, projectId)
  if (!data) return c.json({ error: 'Project not found' }, 404)
  return c.json({ gantt: data }, 200)
})

// PATCH /api/projects/:id/milestones/:mid/dates
projectGanttRoutes.patch(
  '/:id/milestones/:mid/dates',
  requirePermission('projects:write'),
  async (c) => {
    const session = c.get('session')
    if (!session || session.type !== 'user' || !session.tid) {
      return c.json({ error: 'Unauthorized' }, 401)
    }

    const milestoneId = c.req.param('mid')
    const parsed = updateDatesSchema.safeParse(await c.req.json())
    if (!parsed.success) {
      return c.json({ error: 'Invalid request', issues: parsed.error.issues }, 400)
    }

    const db = c.get('db')
    const updated = await updateMilestoneDueDate(
      db,
      session.tid,
      milestoneId,
      parsed.data.due_date ?? null,
    )
    if (!updated) return c.json({ error: 'Milestone not found' }, 404)
    return c.json({ milestone: updated }, 200)
  },
)

// PATCH /api/projects/:id/tasks/:tid/dates
projectGanttRoutes.patch(
  '/:id/tasks/:tid/dates',
  requirePermission('projects:write'),
  async (c) => {
    const session = c.get('session')
    if (!session || session.type !== 'user' || !session.tid) {
      return c.json({ error: 'Unauthorized' }, 401)
    }

    const taskId = c.req.param('tid')
    const parsed = updateDatesSchema.safeParse(await c.req.json())
    if (!parsed.success) {
      return c.json({ error: 'Invalid request', issues: parsed.error.issues }, 400)
    }

    const db = c.get('db')
    const updated = await updateTaskDueDate(db, session.tid, taskId, parsed.data.due_date ?? null)
    if (!updated) return c.json({ error: 'Task not found' }, 404)
    return c.json({ task: updated }, 200)
  },
)
