/**
 * Dev-only test utility routes.
 *
 * These endpoints are ONLY registered when NODE_ENV !== 'production'.
 * They exist solely to support automated e2e tests (e.g. simulating a
 * server restart by flushing and reloading the in-memory layer store from
 * the database, or injecting legacy DB formats to test migration paths).
 * They must never be available in production.
 */

import { Router, type IRouter, type Request, type Response } from 'express';
import { layers } from '../data/store';
import { dbLoadLayers } from '../data/persist';
import { pool } from '../data/db';
import { requireAdmin } from '../middlewares/auth';

const router: IRouter = Router();

/**
 * POST /api/test/force-reload
 *
 * Flushes the in-memory layers array and re-populates it from the database,
 * exactly as `initializeStore` does on server startup.  This lets e2e tests
 * verify that persisted data (e.g. saved row filters) survive a restart
 * without having to actually kill and reboot the process.
 */
router.post('/test/force-reload', requireAdmin, async (_req: Request, res: Response): Promise<void> => {
  try {
    const fresh = await dbLoadLayers();
    // Replace in-memory array in-place so all route handlers see the new data.
    layers.splice(0, layers.length, ...fresh);
    res.json({ ok: true, layerCount: layers.length });
  } catch (err) {
    res.status(500).json({ error: (err as Error).message });
  }
});

/**
 * POST /api/test/set-raw-row-filters
 *
 * Writes a raw (potentially old-format) row_filters JSON directly to the
 * database for a given layer, bypassing any in-memory migration logic.
 * Used by tests to reproduce the legacy flat-format { combinator, conditions[] }
 * state that existed before the recursive tree migration was added, so we can
 * confirm that dbLoadLayers() correctly migrates it on the next force-reload.
 *
 * Body: { layerId: string, rawFilters: unknown }
 */
router.post('/test/set-raw-row-filters', requireAdmin, async (req: Request, res: Response): Promise<void> => {
  const { layerId, rawFilters } = req.body as { layerId?: string; rawFilters?: unknown };
  if (!layerId) { res.status(400).json({ error: 'layerId required' }); return; }
  try {
    await pool.query(
      'UPDATE sc_layers SET row_filters = $1 WHERE id = $2',
      [JSON.stringify(rawFilters ?? null), layerId],
    );
    res.json({ ok: true });
  } catch (err) {
    res.status(500).json({ error: (err as Error).message });
  }
});

export default router;
