/**
 * Revenue forecast routes — revenue-forecasting (spec 116).
 *
 * Mounted at /api/reports (declared in index.ts router).
 *
 * Routes:
 *   GET /revenue-forecast — 3/6/12/24 month revenue forecast
 *
 * Access: Business+ tier + reports:read permission.
 */
import { Hono, type Context } from 'hono'
import { z } from 'zod'
import type { AppEnv } from '../../types'
import { authMiddleware } from '../../middleware/auth'
import { requirePermission, requireTier } from '../../middleware/guards'
import { getRevenueForecast } from '@zync/db/queries'
import { TenantTier } from '@zync/types'

const forecastRoutes = new Hono<AppEnv>()
const monthsSchema = z.union([
  z.literal('3'),
  z.literal('6'),
  z.literal('12'),
  z.literal('24'),
]).optional()

forecastRoutes.use('*', authMiddleware)
forecastRoutes.use('*', requireTier(TenantTier.BUSINESS))
forecastRoutes.use('*', requirePermission('reports:read'))

async function handleForecastRequest(c: Context<AppEnv>) {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'No tenant context' }, 403)
  }

  const parsed = monthsSchema.safeParse(c.req.query('months'))
  if (!parsed.success) {
    return c.json({ error: 'Invalid months value' }, 400)
  }

  const db = c.get('db')
  const result = await getRevenueForecast(
    db,
    session.tid,
    Number(parsed.data ?? '12') as 3 | 6 | 12 | 24,
  )

  return c.json(result)
}

forecastRoutes.get('/', handleForecastRequest)

export { forecastRoutes }
