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

const rangeRule = (value, { req }) => {
  const min = Number(req.body.puntos_minimos ?? req.body.puntosMinimos);
  const max = Number(req.body.puntos_maximos ?? req.body.puntosMaximos);
  if (Number.isFinite(min) && Number.isFinite(max) && min > max) {
    throw new Error('puntos_minimos no puede ser mayor que puntos_maximos');
  }
  return true;
};

// Crear
const createNivelValidator = [
  body('nombre').isString().trim().notEmpty().withMessage('nombre requerido'),
  body('puntos_minimos').isInt({ min: 0 }).withMessage('puntos_minimos >= 0'),
  body('puntos_maximos').isInt({ min: 0 }).withMessage('puntos_maximos >= 0'),
  body().custom(rangeRule),
];

// Actualizar (parcial)
const updateNivelValidator = [
  param('id').isInt({ gt: 0 }).withMessage('ID inválido'),
  body('nombre').optional().isString().trim().notEmpty(),
  body('puntos_minimos').optional().isInt({ min: 0 }),
  body('puntos_maximos').optional().isInt({ min: 0 }),
  body().custom(rangeRule),
];

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

// Listar con filtros opcionales
// ?pmin=100&pmax=300  ó  ?puntos=135 (nivel que cubre ese puntaje)
const listNivelesValidator = [
  query('pmin').optional().isInt({ min: 0 }),
  query('pmax').optional().isInt({ min: 0 }),
  query('puntos').optional().isInt({ min: 0 }),
];

module.exports = {
  createNivelValidator,
  updateNivelValidator,
  nivelIdValidator,
  listNivelesValidator,
};
