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

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

const {
  createMetaValidator,
  updateMetaValidator,
  metaIdValidator,
  listMetasValidator,
} = require('../validators/metas.validators');

// LISTAR metas (con filtros opcionales)
router.get('/', listMetasValidator, handleValidation, async (req, res) => {
  const { user_id, estado, tipo, categoria, desde, hasta } = req.query;

  let sql = `
    SELECT id_meta, id_usuario, tipo, valor_objetivo, id_categoria,
           fecha_inicio, fecha_fin, estado, progreso_actual, creada_en
      FROM metas
     WHERE 1=1`;
  const params = [];

  if (user_id) { sql += ' AND id_usuario = ?'; params.push(Number(user_id)); }
  if (estado)  { sql += ' AND estado = ?'; params.push(estado); }
  if (tipo)    { sql += ' AND tipo = ?'; params.push(tipo); }
  if (categoria){ sql += ' AND id_categoria = ?'; params.push(Number(categoria)); }
  if (desde)   { sql += ' AND fecha_inicio >= ?'; params.push(desde); }
  if (hasta)   { sql += ' AND fecha_inicio <= ?'; params.push(hasta); }

  sql += ' ORDER BY id_meta DESC';

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

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

// CREAR meta
router.post('/', createMetaValidator, handleValidation, async (req, res) => {
  const {
    id_usuario, tipo, valor_objetivo, id_categoria = null,
    fecha_inicio, fecha_fin = null, estado = 'activa',
    progreso_actual = 0,
  } = req.body;

  try {
    const [result] = await pool.query(
      `INSERT INTO metas
        (id_usuario, tipo, valor_objetivo, id_categoria, fecha_inicio, fecha_fin,
         estado, progreso_actual, creada_en)
       VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW())`,
      [id_usuario, tipo, valor_objetivo, id_categoria, fecha_inicio, fecha_fin, estado, progreso_actual]
    );
    res.status(201).json({ message: 'Meta creada', id: result.insertId });
  } catch (e) {
    console.error(e);
    res.status(500).json({ error: 'Error al crear meta' });
  }
});

// ACTUALIZAR meta (parcial)
router.put('/:id', updateMetaValidator, handleValidation, async (req, res) => {
  const { id } = req.params;
  const {
    id_usuario = null, tipo = null, valor_objetivo = null, id_categoria = null,
    fecha_inicio = null, fecha_fin = null, estado = null, progreso_actual = null,
  } = req.body;

  try {
    const [result] = await pool.query(
      `UPDATE metas
          SET id_usuario = COALESCE(?, id_usuario),
              tipo = COALESCE(?, tipo),
              valor_objetivo = COALESCE(?, valor_objetivo),
              id_categoria = COALESCE(?, id_categoria),
              fecha_inicio = COALESCE(?, fecha_inicio),
              fecha_fin = COALESCE(?, fecha_fin),
              estado = COALESCE(?, estado),
              progreso_actual = COALESCE(?, progreso_actual)
        WHERE id_meta = ?`,
      [id_usuario, tipo, valor_objetivo, id_categoria, fecha_inicio, fecha_fin, estado, progreso_actual, id]
    );
    if (result.affectedRows === 0) return res.status(404).json({ error: 'Meta no encontrada' });
    res.json({ message: 'Meta actualizada' });
  } catch (e) {
    console.error(e);
    res.status(500).json({ error: 'Error al actualizar meta' });
  }
});

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

module.exports = router;
