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

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

const {
  createNivelValidator,
  updateNivelValidator,
  nivelIdValidator,
  listNivelesValidator,
} = require('../validators/niveles.validators');

// LISTAR (con filtros)
router.get('/', listNivelesValidator, handleValidation, async (req, res) => {
  const { pmin, pmax, puntos } = req.query;

  let sql = `
    SELECT id_nivel, nombre, puntos_minimos, puntos_maximos
      FROM niveles
     WHERE 1=1`;
  const params = [];

  if (pmin !== undefined) { sql += ' AND puntos_maximos >= ?'; params.push(Number(pmin)); }
  if (pmax !== undefined) { sql += ' AND puntos_minimos <= ?'; params.push(Number(pmax)); }
  if (puntos !== undefined) {
    sql += ' AND ? BETWEEN puntos_minimos AND puntos_maximos';
    params.push(Number(puntos));
  }

  sql += ' ORDER BY puntos_minimos 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 niveles' });
  }
});

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

// CREAR
router.post('/', createNivelValidator, handleValidation, async (req, res) => {
  const { nombre, puntos_minimos, puntos_maximos } = req.body;
  try {
    const [result] = await pool.query(
      `INSERT INTO niveles (nombre, puntos_minimos, puntos_maximos)
       VALUES (?, ?, ?)`,
      [nombre, puntos_minimos, puntos_maximos]
    );
    res.status(201).json({ message: 'Nivel creado', id: result.insertId });
  } catch (e) {
    console.error(e);
    res.status(500).json({ error: 'Error al crear nivel' });
  }
});

// ACTUALIZAR (parcial)
router.put('/:id', updateNivelValidator, handleValidation, async (req, res) => {
  const { id } = req.params;
  const {
    nombre = null,
    puntos_minimos = null,
    puntos_maximos = null,
  } = req.body;

  try {
    const [result] = await pool.query(
      `UPDATE niveles
          SET nombre = COALESCE(?, nombre),
              puntos_minimos = COALESCE(?, puntos_minimos),
              puntos_maximos = COALESCE(?, puntos_maximos)
        WHERE id_nivel = ?`,
      [nombre, puntos_minimos, puntos_maximos, id]
    );
    if (result.affectedRows === 0) return res.status(404).json({ error: 'Nivel no encontrado' });
    res.json({ message: 'Nivel actualizado' });
  } catch (e) {
    console.error(e);
    res.status(500).json({ error: 'Error al actualizar nivel' });
  }
});

// ELIMINAR
router.delete('/:id', nivelIdValidator, handleValidation, async (req, res) => {
  try {
    const [result] = await pool.query('DELETE FROM niveles WHERE id_nivel = ?', [req.params.id]);
    if (result.affectedRows === 0) return res.status(404).json({ error: 'Nivel no encontrado' });
    res.json({ message: 'Nivel eliminado' });
  } catch (e) {
    console.error(e);
    res.status(500).json({ error: 'Error al eliminar nivel' });
  }
});

module.exports = router;
