/**
 * GET /api/admin/analytics — tab-based analytics endpoint — admin-reports-analytics.
 *
 * Serves module adoption, AI usage, and funnel 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 {
  analyticsQuerySchema,
  getModuleAdoptionReport,
  getAiUsageReport,
  getFunnelReport,
  FunnelUnavailableError,
} 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 adminAnalyticsTabRoutes = new Hono<AppEnv>()

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

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

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

  // Default date range: last 30 days (module adoption) / current month (parity)
  const now = new Date()
  const thirtyDaysAgo = new Date(now.getTime() - 30 * 86400000)
  const rangeFrom = from ?? thirtyDaysAgo.toISOString().slice(0, 10)
  const rangeTo = to ?? now.toISOString().slice(0, 10)
  const range = { from: rangeFrom, to: rangeTo }

  const usdIlsRate = Number(c.env.ADMIN_REPORTS_USD_ILS_RATE ?? 3.7)

  const db = createDb(c.env)

  try {
    let data: unknown

    if (tab === 'modules') {
      data = await getModuleAdoptionReport(db, range)
    } else if (tab === 'ai') {
      data = await getAiUsageReport(db, range, usdIlsRate)
    } else {
      // funnel
      try {
        data = await getFunnelReport(c.env, range)
      } catch (err) {
        if (err instanceof FunnelUnavailableError) {
          return c.json({ error: 'funnel_unavailable' }, 503)
        }
        throw err
      }
    }

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

export { adminAnalyticsTabRoutes }
