// src/routes/actividades.routes.js
const express = require('express');
const router = express.Router();
const pool = require('../config/db');
const { requireAuth } = require('../utils/jwt');
const requireAdmin = require('../middleware/requireAdmin');
const handleValidation = require('../middleware/handleValidation');

const {
  createActividadValidator,
  updateActividadValidator,
  listActividadesValidator
} = require('../validators/actividades.validators');

/** =========================
 *  Rutas públicas/estudiante
 *  ========================= */
// Listar actividades (filtro por id_categoria opcional)
router.get('/', listActividadesValidator, handleValidation, async (req, res, next) => {
  try {
    const { page = 1, limit = 20, q = '', id_categoria } = req.query;
    const offset = (page - 1) * limit;

    const whereParts = [];
    const params = [];
    if (q) { whereParts.push('(a.nombre LIKE ? OR a.descripcion LIKE ?)'); params.push(`%${q}%`, `%${q}%`); }
    if (id_categoria) { whereParts.push('a.id_categoria = ?'); params.push(+id_categoria); }
    const whereSQL = whereParts.length ? `WHERE ${whereParts.join(' AND ')}` : '';

    const [rows] = await pool.query(
      `SELECT a.id_actividad, a.id_categoria, c.nombre AS categoria,
              a.nombre, a.descripcion, a.duracion_minutos, a.dificultad, a.puntos_base, a.activo
       FROM actividades a
       JOIN categorias c ON c.id_categoria = a.id_categoria
       ${whereSQL}
       ORDER BY a.id_actividad DESC
       LIMIT ? OFFSET ?`,
      [...params, +limit, +offset]
    );

    const [[{ total }]] = await pool.query(
      `SELECT COUNT(*) AS total FROM actividades a ${whereSQL}`,
      params
    );

    res.json({ data: rows, page: +page, limit: +limit, total });
  } catch (err) { next(err); }
});

/** =========================
 *  Rutas ADMIN
 *  ========================= */
router.post('/',
  requireAuth, requireAdmin(),
  createActividadValidator, handleValidation,
  async (req, res, next) => {
    try {
      const {
        id_categoria, nombre, descripcion = null,
        duracion_minutos = 3, dificultad = 1,
        puntos_base = 0, activo = true
      } = req.body;

      const [ck] = await pool.query(`SELECT 1 FROM categorias WHERE id_categoria=?`, [id_categoria]);
      if (!ck.length) return res.status(400).json({ error: 'id_categoria no existe' });

      const [r] = await pool.query(
        `INSERT INTO actividades
         (id_categoria, nombre, descripcion, duracion_minutos, dificultad, puntos_base, activo)
         VALUES (?,?,?,?,?,?,?)`,
        [id_categoria, nombre, descripcion, duracion_minutos, dificultad, puntos_base, activo ? 1 : 0]
      );

      const [row] = await pool.query(
        `SELECT id_actividad, id_categoria, nombre, descripcion, duracion_minutos, dificultad, puntos_base, activo
         FROM actividades WHERE id_actividad=?`,
        [r.insertId]
      );
      res.status(201).json(row[0]);
    } catch (err) { next(err); }
  }
);

router.put('/:id_actividad',
  requireAuth, requireAdmin(),
  updateActividadValidator, handleValidation,
  async (req, res, next) => {
    try {
      const id = +req.params.id_actividad;
      const fields = ['id_categoria','nombre','descripcion','duracion_minutos','dificultad','puntos_base','activo'];
      const sets = [];
      const values = [];

      for (const f of fields) {
        if (req.body[f] !== undefined) {
          sets.push(`${f}=?`);
          values.push(f === 'activo' ? (req.body[f] ? 1 : 0) : req.body[f]);
        }
      }
      if (!sets.length) return res.status(400).json({ error: 'Nada para actualizar' });

      if (req.body.id_categoria !== undefined) {
        const [ck] = await pool.query(`SELECT 1 FROM categorias WHERE id_categoria=?`, [req.body.id_categoria]);
        if (!ck.length) return res.status(400).json({ error: 'id_categoria no existe' });
      }

      values.push(id);
      await pool.query(`UPDATE actividades SET ${sets.join(', ')} WHERE id_actividad=?`, values);

      const [row] = await pool.query(
        `SELECT id_actividad, id_categoria, nombre, descripcion, duracion_minutos, dificultad, puntos_base, activo
         FROM actividades WHERE id_actividad=?`,
        [id]
      );
      res.json(row[0]);
    } catch (err) { next(err); }
  }
);

router.delete('/:id_actividad',
  requireAuth, requireAdmin(),
  async (req, res, next) => {
    try {
      const id = +req.params.id_actividad;
      await pool.query(`DELETE FROM actividades WHERE id_actividad=?`, [id]);
      res.status(204).end();
    } catch (err) { next(err); }
  }
);

module.exports = router;
