/**
 * GET /api/admin/reports — tab-based reports endpoint — admin-reports-analytics.
 *
 * Serves revenue, signups/churn, and tenants data to the admin SPA.
 * Guarded by requireAdminSession() + requireAdminPermission('admin.reports:view').
 * Cross-tenant — never calls tenantQuery.
 */
import { Hono } from 'hono'
import { createDb } from '@zync/db/queries'
import {
  reportsQuerySchema,
  getRevenueReport,
  getSignupsReport,
  getTenantsReport,
} from '@zync/admin-analytics'
import type { AppEnv } from '../../types'
import { adminAuthMiddleware } from '../../middleware/admin-auth'
import { requireAdminSession } from '../../middleware/guards'
import { requireAdminPermission } from '@zync/auth'

const adminReportsTabRoutes = new Hono<AppEnv>()

adminReportsTabRoutes.use('*', adminAuthMiddleware)
adminReportsTabRoutes.use('*', requireAdminSession())
adminReportsTabRoutes.use('*', requireAdminPermission('admin.reports:view'))

adminReportsTabRoutes.get('/', async (c) => {
  const parsed = reportsQuerySchema.safeParse(c.req.query())
  if (!parsed.success) {
    return c.json({ error: 'Invalid query params', details: parsed.error.flatten() }, 400)
  }

  const { tab, from, to, page, pageSize } = parsed.data

  // Default date range: current calendar month
  const now = new Date()
  const firstOfMonth = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1))
  const lastOfMonth = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 0))
  const rangeFrom = from ?? firstOfMonth.toISOString().slice(0, 10)
  const rangeTo = to ?? lastOfMonth.toISOString().slice(0, 10)
  const range = { from: rangeFrom, to: rangeTo }

  const db = createDb(c.env)

  try {
    let data: unknown
    if (tab === 'revenue') {
      data = await getRevenueReport(db, range)
    } else if (tab === 'signups') {
      data = await getSignupsReport(db, range)
    } else {
      // tenants
      data = await getTenantsReport(db, range, page, pageSize)
    }

    c.header('Cache-Control', 'private, no-store')
    return c.json({ tab, range, data })
  } catch (err) {
    console.error('[admin/reports-tab]', err)
    return c.json({ error: 'Internal server error' }, 500)
  }
})

export { adminReportsTabRoutes }
