// src/validators/metas.validators.js
const { body, param, query } = require('express-validator');

/**
 * Recomendado: ajusta TIPOS y ESTADOS a lo que uses en tu app
 * (Si tu tabla no tiene restricción, igual sirve validar contra este set)
 */
const TIPOS = ['puntos', 'minutos', 'actividades', 'streak_dias', 'categoria'];
const ESTADOS = ['activa', 'completada', 'cancelada'];

const createMetaValidator = [
  body('id_usuario').isInt({ gt: 0 }).withMessage('id_usuario > 0'),
  body('tipo').isString().trim().notEmpty().withMessage('tipo requerido')
    .isIn(TIPOS).withMessage(`tipo debe ser: ${TIPOS.join(', ')}`),
  body('valor_objetivo').isInt({ gt: 0 }).withMessage('valor_objetivo > 0'),
  body('id_categoria').optional().isInt({ gt: 0 }),
  body('fecha_inicio').isISO8601().withMessage('fecha_inicio inválida (ISO8601)'),
  body('fecha_fin').optional().isISO8601().withMessage('fecha_fin inválida (ISO8601)'),
  body('estado').optional().isIn(ESTADOS).withMessage(`estado: ${ESTADOS.join(', ')}`),
  body('progreso_actual').optional().isInt({ min: 0 }).withMessage('progreso_actual >= 0'),
];

const updateMetaValidator = [
  param('id').isInt({ gt: 0 }).withMessage('ID inválido'),
  body('id_usuario').optional().isInt({ gt: 0 }),
  body('tipo').optional().isIn(TIPOS),
  body('valor_objetivo').optional().isInt({ gt: 0 }),
  body('id_categoria').optional().isInt({ gt: 0 }),
  body('fecha_inicio').optional().isISO8601(),
  body('fecha_fin').optional().isISO8601(),
  body('estado').optional().isIn(ESTADOS),
  body('progreso_actual').optional().isInt({ min: 0 }),
];

const metaIdValidator = [
  param('id').isInt({ gt: 0 }).withMessage('ID inválido'),
];

// Filtros: ?user_id=&estado=&tipo=&categoria=&desde=&hasta=
const listMetasValidator = [
  query('user_id').optional().isInt({ gt: 0 }),
  query('estado').optional().isIn(ESTADOS),
  query('tipo').optional().isIn(TIPOS),
  query('categoria').optional().isInt({ gt: 0 }),
  query('desde').optional().isISO8601(),
  query('hasta').optional().isISO8601(),
];

module.exports = {
  createMetaValidator,
  updateMetaValidator,
  metaIdValidator,
  listMetasValidator,
  TIPOS,
  ESTADOS,
};
