/**
 * Team time overview routes — team-time-overview (wave-8 leaf 8).
 * Mounted at /api/time/team in apps/zync-api/src/routes/index.ts.
 *
 * Routes:
 *   GET /time/team            → team overview (all members) — time:manage
 *   GET /time/team/:userId    → member detail — time:manage
 *
 * Requires time:manage (OWNER/ADMIN) — members see only their own data
 * via the existing GET /time route.
 */
import { Hono } from 'hono'
import { z } from 'zod'
import type { AppEnv } from '../../types'
import { authMiddleware } from '../../middleware/auth'
import { requireModuleEnabled } from '../../middleware/require-module-enabled'
import { requirePermission } from '../../middleware/guards'
import { createDb, getTeamTimeOverview, getMemberTimeDetail } from '@zync/db/queries'

// ── Schemas ────────────────────────────────────────────────────────────────────

const dateRangeSchema = z.object({
  start: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'Expected YYYY-MM-DD').optional(),
  end: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'Expected YYYY-MM-DD').optional(),
})

function defaultDateRange(): { start: string; end: string } {
  const now = new Date()
  // Default: current calendar month
  const start = new Date(now.getFullYear(), now.getMonth(), 1).toISOString().slice(0, 10)
  const end = new Date(now.getFullYear(), now.getMonth() + 1, 0).toISOString().slice(0, 10)
  return { start, end }
}

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

export const timeTeamRoutes = new Hono<AppEnv>()

timeTeamRoutes.use('*', authMiddleware)
timeTeamRoutes.use('*', requireModuleEnabled('time_management'))

// ── GET / (team overview) ──────────────────────────────────────────────────────

timeTeamRoutes.get(
  '/',
  requirePermission('time:manage'),
  async (c) => {
    const session = c.get('session')
    if (!session || session.type !== 'user' || !session.tid) {
      return c.json({ error: 'Unauthorized' }, 401)
    }

    const raw = Object.fromEntries(new URL(c.req.url).searchParams.entries())
    const parsed = dateRangeSchema.safeParse(raw)
    if (!parsed.success) {
      return c.json({ error: 'Invalid query params', issues: parsed.error.issues }, 400)
    }

    const defaults = defaultDateRange()
    const start = parsed.data.start ?? defaults.start
    const end = parsed.data.end ?? defaults.end

    const db = createDb(c.env)
    const result = await getTeamTimeOverview(db, session.tid, start, end)

    c.header('Cache-Control', 'private, no-store')
    return c.json(result, 200)
  },
)

// ── GET /:userId (member detail) ──────────────────────────────────────────────

timeTeamRoutes.get(
  '/:userId',
  requirePermission('time:manage'),
  async (c) => {
    const session = c.get('session')
    if (!session || session.type !== 'user' || !session.tid) {
      return c.json({ error: 'Unauthorized' }, 401)
    }

    const userId = c.req.param('userId')
    if (!userId || !/^[0-9a-f-]{36}$/.test(userId)) {
      return c.json({ error: 'Invalid userId' }, 400)
    }

    const raw = Object.fromEntries(new URL(c.req.url).searchParams.entries())
    const parsed = dateRangeSchema.safeParse(raw)
    if (!parsed.success) {
      return c.json({ error: 'Invalid query params', issues: parsed.error.issues }, 400)
    }

    const defaults = defaultDateRange()
    const start = parsed.data.start ?? defaults.start
    const end = parsed.data.end ?? defaults.end

    const db = createDb(c.env)
    const result = await getMemberTimeDetail(db, session.tid, userId, start, end)

    c.header('Cache-Control', 'private, no-store')
    return c.json(result, 200)
  },
)
