// src/routes/insignias.routes.js
const express = require('express');
const router = express.Router();

const pool = require('../config/db');
const handleValidation = require('../middleware/handleValidation');

const {
  createInsigniaValidator,
  updateInsigniaValidator,
  insigniaIdValidator,
  listInsigniasValidator,
} = require('../validators/insignias.validators');

// LISTAR (con filtros ?tipo=&min_valor=)
router.get('/', listInsigniasValidator, handleValidation, async (req, res) => {
  const { tipo, min_valor } = req.query;

  let sql = `
    SELECT id_insignia, nombre, descripcion, criterio_tipo, criterio_valor, icono
      FROM insignias
     WHERE 1=1`;
  const params = [];

  if (tipo) { sql += ' AND criterio_tipo = ?'; params.push(tipo); }
  if (min_valor) { sql += ' AND criterio_valor >= ?'; params.push(Number(min_valor)); }

  sql += ' ORDER BY id_insignia ASC';

  try {
    const [rows] = await pool.query(sql, params);
    res.json(rows);
  } catch (e) {
    console.error(e);
    res.status(500).json({ error: 'Error al listar insignias' });
  }
});

// DETALLE
router.get('/:id', insigniaIdValidator, handleValidation, async (req, res) => {
  try {
    const [rows] = await pool.query(
      'SELECT * FROM insignias WHERE id_insignia = ?',
      [req.params.id]
    );
    if (!rows.length) return res.status(404).json({ error: 'Insignia no encontrada' });
    res.json(rows[0]);
  } catch (e) {
    console.error(e);
    res.status(500).json({ error: 'Error al obtener insignia' });
  }
});

// CREAR
router.post('/', createInsigniaValidator, handleValidation, async (req, res) => {
  const { nombre, descripcion = null, criterio_tipo, criterio_valor, icono = null } = req.body;
  try {
    const [result] = await pool.query(
      `INSERT INTO insignias (nombre, descripcion, criterio_tipo, criterio_valor, icono)
       VALUES (?, ?, ?, ?, ?)`,
      [nombre, descripcion, criterio_tipo, criterio_valor, icono]
    );
    res.status(201).json({ message: 'Insignia creada', id: result.insertId });
  } catch (e) {
    console.error(e);
    res.status(500).json({ error: 'Error al crear insignia' });
  }
});

// ACTUALIZAR
router.put('/:id', updateInsigniaValidator, handleValidation, async (req, res) => {
  const { id } = req.params;
  const {
    nombre = null, descripcion = null,
    criterio_tipo = null, criterio_valor = null,
    icono = null,
  } = req.body;

  try {
    const [result] = await pool.query(
      `UPDATE insignias
          SET nombre = COALESCE(?, nombre),
              descripcion = COALESCE(?, descripcion),
              criterio_tipo = COALESCE(?, criterio_tipo),
              criterio_valor = COALESCE(?, criterio_valor),
              icono = COALESCE(?, icono)
        WHERE id_insignia = ?`,
      [nombre, descripcion, criterio_tipo, criterio_valor, icono, id]
    );
    if (result.affectedRows === 0) return res.status(404).json({ error: 'Insignia no encontrada' });
    res.json({ message: 'Insignia actualizada' });
  } catch (e) {
    console.error(e);
    res.status(500).json({ error: 'Error al actualizar insignia' });
  }
});

// ELIMINAR
router.delete('/:id', insigniaIdValidator, handleValidation, async (req, res) => {
  try {
    const [result] = await pool.query(
      'DELETE FROM insignias WHERE id_insignia = ?',
      [req.params.id]
    );
    if (result.affectedRows === 0) return res.status(404).json({ error: 'Insignia no encontrada' });
    res.json({ message: 'Insignia eliminada' });
  } catch (e) {
    console.error(e);
    res.status(500).json({ error: 'Error al eliminar insignia' });
  }
});

module.exports = router;
