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

// Ajusta estos catálogos a tu app
const TIPOS = ['actividad', 'recordatorio', 'meta', 'sistema'];
const CANALES = ['push', 'email', 'sms', 'inapp'];
const ESTADOS = ['programada', 'enviada', 'leida', 'cancelada'];

// Crear
const createNotiValidator = [
  body('id_usuario').isInt({ gt: 0 }).withMessage('id_usuario > 0'),
  body('tipo').isIn(TIPOS).withMessage(`tipo: ${TIPOS.join(', ')}`),
  body('titulo').isString().trim().notEmpty().isLength({ max: 150 }),
  body('cuerpo').isString().trim().notEmpty().isLength({ max: 2000 }),
  body('canal').isIn(CANALES).withMessage(`canal: ${CANALES.join(', ')}`),
  body('programada_para').isISO8601().withMessage('programada_para inválida (ISO8601)'),
  body('meta').optional().isInt({ gt: 0 }),
  body('estado').optional().isIn(ESTADOS),
];

// Actualizar (parcial)
const updateNotiValidator = [
  param('id').isInt({ gt: 0 }),
  body('id_usuario').optional().isInt({ gt: 0 }),
  body('tipo').optional().isIn(TIPOS),
  body('titulo').optional().isString().trim().notEmpty().isLength({ max: 150 }),
  body('cuerpo').optional().isString().trim().notEmpty().isLength({ max: 2000 }),
  body('canal').optional().isIn(CANALES),
  body('programada_para').optional().isISO8601(),
  body('meta').optional().isInt({ gt: 0 }),
  body('estado').optional().isIn(ESTADOS),
];

// Por id
const notiIdValidator = [ param('id').isInt({ gt: 0 }) ];

// Listado con filtros
// ?user_id=&estado=&canal=&tipo=&desde=&hasta=&solo_pendientes=1
const listNotiValidator = [
  query('user_id').optional().isInt({ gt: 0 }),
  query('estado').optional().isIn(ESTADOS),
  query('canal').optional().isIn(CANALES),
  query('tipo').optional().isIn(TIPOS),
  query('desde').optional().isISO8601(),
  query('hasta').optional().isISO8601(),
  query('solo_pendientes').optional().isInt({ min: 0, max: 1 }),
];

// Acciones rápidas
const markIdValidator = [ param('id').isInt({ gt: 0 }) ];

module.exports = {
  createNotiValidator,
  updateNotiValidator,
  notiIdValidator,
  listNotiValidator,
  markIdValidator,
  TIPOS, CANALES, ESTADOS,
};
