'use strict';

const express = require('express');
const router  = express.Router();
const svc     = require('../services/gastosService');
const { sanitizeDate, sanitizeInt } = require('../utils/validate');

function ok(res, data)   { res.json({ ok: true,  data }); }
function fail(res, msg, code = 500) { res.status(code).json({ ok: false, error: msg }); }

function parseParams(query) {
  const idturno  = sanitizeInt(query.idturno);
  const inicio   = sanitizeDate(query.inicio);
  const fin      = sanitizeDate(query.fin);
  const page     = query.page;
  const pageSize = query.pageSize;
  if (!idturno && (!inicio || !fin)) return null;
  return { idturno, inicio, fin, page, pageSize };
}

router.get('/en-vivo', async (req, res, next) => {
  try {
    const data = await svc.getEnVivo();
    ok(res, data);
  } catch (err) { next(err); }
});

router.get('/', async (req, res, next) => {
  try {
    const params = parseParams(req.query);
    if (!params) return fail(res, 'Parámetros requeridos: idturno o inicio+fin', 400);

    const [resumen, porConcepto, porUsuario, { movimientos, paginacion }] = await Promise.all([
      svc.getResumen(params),
      svc.getPorConcepto(params),
      svc.getPorUsuario(params),
      svc.getMovimientos(params),
    ]);

    const periodo = params.idturno
      ? { tipo: 'turno', idturno: params.idturno }
      : { tipo: 'fecha', inicio: params.inicio, fin: params.fin };

    ok(res, { resumen, porConcepto, porUsuario, movimientos, paginacion, periodo, generadoEn: new Date().toISOString() });
  } catch (err) { next(err); }
});

module.exports = router;
