/**
 * Saved list filters routes — saved-list-filters (wave-8 leaf9).
 * Mounted at /api/saved-filters in routes/index.ts.
 *
 * GET    /             — list saved filters for entityType (query param)
 * POST   /             — create a saved filter
 * DELETE /:id          — delete own saved filter
 */
import { Hono } from 'hono'
import { z } from 'zod'
import type { AppEnv } from '../types'
import { authMiddleware } from '../middleware/auth'
import {
  createDb,
  listSavedFilters,
  createSavedFilter,
  deleteSavedFilter,
  createSavedFilterSchema,
} from '@zync/db/queries'

export const savedFiltersRoutes = new Hono<AppEnv>()

savedFiltersRoutes.use('*', authMiddleware)

// ── GET /saved-filters ────────────────────────────────────────────────────────

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

  const entityType = new URL(c.req.url).searchParams.get('entityType')
  if (!entityType) {
    return c.json({ error: 'entityType query param required' }, 400)
  }

  const validTypes = z.enum(['invoices', 'customers', 'projects', 'expenses', 'tasks'])
  const parsed = validTypes.safeParse(entityType)
  if (!parsed.success) {
    return c.json({ error: 'Invalid entityType' }, 400)
  }

  const db = createDb(c.env)
  const filters = await listSavedFilters(db, session.tid, session.sub, parsed.data)
  return c.json({ filters }, 200)
})

// ── POST /saved-filters ───────────────────────────────────────────────────────

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

  const body = await c.req.json().catch(() => null)
  const parsed = createSavedFilterSchema.safeParse(body)
  if (!parsed.success) {
    return c.json({ error: 'Validation failed', issues: parsed.error.issues }, 400)
  }

  const db = createDb(c.env)
  const filter = await createSavedFilter(db, session.tid, session.sub, parsed.data)
  return c.json({ filter }, 201)
})

// ── DELETE /saved-filters/:id ─────────────────────────────────────────────────

savedFiltersRoutes.delete('/:id', async (c) => {
  const session = c.get('session')
  if (!session || session.type !== 'user' || !session.tid) {
    return c.json({ error: 'Unauthorized' }, 401)
  }

  const { id } = c.req.param()
  if (!id) {
    return c.json({ error: 'Missing id' }, 400)
  }

  const db = createDb(c.env)
  const deleted = await deleteSavedFilter(db, session.tid, session.sub, id)
  if (!deleted) {
    return c.json({ error: 'Filter not found or not owned by user' }, 404)
  }

  return c.json({ ok: true }, 200)
})
