/**
 * Admin tenants list + detail routes — admin-dashboard.
 * GET /api/admin/tenants        → paginated tenant list
 * GET /api/admin/tenants/:slug  → tenant detail
 */
import { Hono } from 'hono'
import { z } from 'zod'
import { createDb } from '@zync/db/queries'
import { listTenantsAdmin, getTenantDetailAdmin } from '@zync/db/queries'
import type { AppEnv } from '../../types'
import { adminAuthMiddleware } from '../../middleware/admin-auth'
import { requireAdminSession } from '../../middleware/guards'
import { requireAdminPermission } from '@zync/auth'

const VALID_TIERS = ['freelancer', 'business', 'enterprise', 'white_label'] as const
const VALID_SORTS = ['name', 'created_at', 'tier', 'status'] as const

const ListTenantsQuerySchema = z.object({
  search: z.string().optional(),
  tier: z.enum(VALID_TIERS).optional(),
  status: z.enum(['active', 'suspended']).optional(),
  sort: z.enum(VALID_SORTS).optional().default('created_at'),
  order: z.enum(['asc', 'desc']).optional().default('desc'),
  page: z.coerce.number().int().positive().optional().default(1),
  limit: z.coerce.number().int().positive().max(200).optional().default(50),
})

const adminTenantsRoutes = new Hono<AppEnv>()

adminTenantsRoutes.use('*', adminAuthMiddleware)
adminTenantsRoutes.use('*', requireAdminSession())
adminTenantsRoutes.use('*', requireAdminPermission('admin.tenants:read'))

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

  const db = createDb(c.env)
  const result = await listTenantsAdmin(db, {
    search: parsed.data.search,
    tier: parsed.data.tier,
    status: parsed.data.status,
    sort: parsed.data.sort,
    order: parsed.data.order,
    page: parsed.data.page,
    limit: parsed.data.limit,
  })

  return c.json(result)
})

adminTenantsRoutes.get('/:slug', async (c) => {
  const slug = c.req.param('slug')
  const db = createDb(c.env)
  const detail = await getTenantDetailAdmin(db, slug)

  if (!detail) {
    return c.json({ error: 'Tenant not found' }, 404)
  }

  return c.json(detail)
})

export { adminTenantsRoutes }
