'use strict';
const express = require('express');
const router  = express.Router();
const svc     = require('../services/mantenimientoService');
const { sanitizeDate, sanitizeInt } = require('../utils/validate');
// authMiddleware ya se aplica globalmente en index.js para todas las rutas /api
// No es necesario aplicarlo de nuevo aquí.

// GET /api/mantenimiento/cuentas?inicio=&fin= | ?idturno= | &filtros={}
router.get('/cuentas', async (req, res, next) => {
  try {
    const idturno = sanitizeInt(req.query.idturno);
    const inicio  = sanitizeDate(req.query.inicio);
    const fin     = sanitizeDate(req.query.fin);
    if (!idturno && (!inicio || !fin))
      return res.status(400).json({ ok: false, error: 'Se requiere idturno o inicio+fin' });

    // FIX: extraer solo claves conocidas del JSON para prevenir prototype pollution
    let filtros = {};
    try {
      if (req.query.filtros) {
        const parsed = JSON.parse(req.query.filtros);
        // Whitelist explícita — nunca pasar el objeto parsed directamente
        const FILTROS_PERMITIDOS = ['efectivo','tarjeta','vales','otros','canceladas','cortesias','noReimpresas'];
        for (const k of FILTROS_PERMITIDOS) {
          if (k in parsed) filtros[k] = parsed[k];
        }
      }
    } catch(_) {}

    const data = await svc.getCuentasPeriodo({ inicio, fin, idturno, filtros });
    res.json({ ok: true, data });
  } catch (e) { next(e); }
});

// GET /api/mantenimiento/refoliador — leer ultimofolio actual
router.get('/refoliador', async (req, res, next) => {
  try {
    const data = await svc.getUltimoFolio();
    res.json({ ok: true, data });
  } catch (e) { next(e); }
});

// POST /api/mantenimiento/refoliador — actualizar ultimofolio
router.post('/refoliador', async (req, res, next) => {
  try {
    const { folioNuevo } = req.body || {};
    if (!folioNuevo || isNaN(folioNuevo))
      return res.status(400).json({ ok: false, error: 'folioNuevo requerido' });
    const data = await svc.setUltimoFolio({
      folioNuevo: parseInt(folioNuevo),
      usuario: req.user?.nombre || req.user?.usuario || 'admin',
    });
    res.json({ ok: true, data });
  } catch (e) { next(e); }
});

// GET /api/mantenimiento/folio/:folio
router.get('/folio/:folio', async (req, res, next) => {
  try {
    const folio = sanitizeInt(req.params.folio);
    if (!folio) return res.status(400).json({ ok: false, error: 'Folio inválido' });
    const data = await svc.getDetalleFolio(folio);
    res.json({ ok: true, data });
  } catch (e) { next(e); }
});

// DELETE /api/mantenimiento/folios  body: { folios:[], inicio, fin, idturno }
router.delete('/folios', async (req, res, next) => {
  try {
    const { folios, inicio, fin, idturno } = req.body || {};
    if (!Array.isArray(folios) || !folios.length)
      return res.status(400).json({ ok: false, error: 'Lista de folios vacía' });
    if (folios.length > 500)
      return res.status(400).json({ ok: false, error: 'Máximo 500 folios por operación' });
    const result = await svc.eliminarFolios({
      folios: folios.map(Number),
      usuario: req.user?.nombre || req.user?.usuario || 'admin',
      inicio, fin, idturno,
    });
    res.json({ ok: true, data: result });
  } catch (e) { next(e); }
});

// GET /api/mantenimiento/bitacora
router.get('/bitacora', async (req, res, next) => {
  try {
    const data = await svc.getBitacora();
    res.json({ ok: true, data });
  } catch (e) { next(e); }
});

module.exports = router;
