'use strict';
const express = require('express');
const router  = express.Router();
const svc     = require('../services/productosAdminService');
const { sanitizeString, sanitizeInt } = require('../utils/validate');

// authMiddleware ya se aplica globalmente en index.js para /api — no duplicar

// GET /api/productos-admin/catalogo?idgrupo=&buscar=&suspendido=
router.get('/catalogo', async (req, res, next) => {
  try {
    const filtros = {
      idgrupo:    sanitizeString(req.query.idgrupo, 20) || undefined,
      idsubgrupo: sanitizeString(req.query.idsubgrupo, 20) || undefined,
      buscar:     sanitizeString(req.query.buscar, 100) || undefined,
      suspendido: ['si','no'].includes(req.query.suspendido) ? req.query.suspendido : undefined,
    };
    let data = [];
    try { data = await svc.getCatalogo(filtros) || []; } catch(_) {}
    res.json({ ok: true, data });
  } catch(e) { next(e); }
});

// GET /api/productos-admin/grupos
router.get('/grupos', async (req, res, next) => {
  try { res.json({ ok: true, data: await svc.getGrupos() }); } catch(e) { next(e); }
});

// GET /api/productos-admin/subgrupos?idgrupo=
router.get('/subgrupos', async (req, res, next) => {
  try {
    res.json({
      ok: true,
      data: await svc.getSubgrupos({
        idgrupo: sanitizeString(req.query.idgrupo, 20) || undefined,
      }),
    });
  } catch(e) { next(e); }
});

// POST /api/productos-admin/subgrupos
router.post('/subgrupos', async (req, res, next) => {
  try {
    const data = await svc.crearSubgrupo({
      idsubgrupo: sanitizeString(req.body.idsubgrupo, 20) || undefined,
      descripcion: sanitizeString(req.body.descripcion, 100) || undefined,
      idgrupo: sanitizeString(req.body.idgrupo, 20) || undefined,
    });
    res.status(201).json({ ok: true, data });
  } catch(e) { next(e); }
});

// GET /api/productos-admin/areas
router.get('/areas', async (req, res, next) => {
  try { res.json({ ok: true, data: await svc.getAreas() }); } catch(e) { next(e); }
});

// GET /api/productos-admin/unidades
router.get('/unidades', async (req, res, next) => {
  try { res.json({ ok: true, data: await svc.getUnidades() }); } catch(e) { next(e); }
});

// GET /api/productos-admin/:id
router.get('/:id', async (req, res, next) => {
  try {
    const d = await svc.getProducto(req.params.id);
    if (!d) return res.status(404).json({ ok: false, error: 'Producto no encontrado' });
    res.json({ ok: true, data: d });
  } catch(e) { next(e); }
});

// PATCH /api/productos-admin/:id  — editar campos individuales
router.patch('/:id', async (req, res, next) => {
  try {
    res.json({ ok: true, data: await svc.editarProducto(req.params.id, req.body) });
  } catch(e) { next(e); }
});

// POST /api/productos-admin — crear producto nuevo
router.post('/', async (req, res, next) => {
  try {
    const data = await svc.crearProducto(req.body);
    res.status(201).json({ ok: true, data });
  } catch(e) {
    // Expose the actual error message for debugging
    e.expose = true;
    e.status = e.status || 500;
    next(e);
  }
});

// POST /api/productos-admin/masa/suspender
router.post('/masa/suspender', async (req, res, next) => {
  try {
    const { ids, suspendido } = req.body;
    res.json({ ok: true, data: await svc.cambiarSuspendidoMasa(ids, !!suspendido) });
  } catch(e) { next(e); }
});

// POST /api/productos-admin/masa/precio
router.post('/masa/precio', async (req, res, next) => {
  try {
    const { ids, campo, tipo, valor } = req.body;
    res.json({ ok: true, data: await svc.actualizarPrecioMasa(ids, campo, tipo, valor) });
  } catch(e) { next(e); }
});

module.exports = router;
