using FluentValidation;
using SIGCM2.Domain.Permissions;

namespace SIGCM2.Application.Permisos.Assign;

public sealed class AssignPermisosToRolCommandValidator : AbstractValidator<AssignPermisosToRolCommand>
{
    private const string AdminCodigo = "admin";

    public AssignPermisosToRolCommandValidator()
    {
        RuleFor(x => x.RolCodigo)
            .NotEmpty().WithMessage("El código del rol es requerido.");

        RuleFor(x => x.Codigos)
            .NotNull().WithMessage("La lista de permisos no puede ser nula.");

        // Admin no puede quedar con lista vacía — regla RBAC explícita (convención admin-convention)
        RuleFor(x => x.Codigos)
            .Must((cmd, codigos) => !(cmd.RolCodigo == AdminCodigo && codigos.Count == 0))
            .WithMessage("El rol 'admin' debe retener al menos un permiso.");

        // Cada código debe pertenecer al catálogo canónico
        RuleForEach(x => x.Codigos)
            .Must(codigo => Permiso.Todos.Contains(codigo))
            .WithMessage("El código de permiso '{PropertyValue}' no existe en el catálogo.");
    }
}
