using System;
using System.ComponentModel.DataAnnotations;

namespace GestionIntegral.Api.Dtos.Contables
{
    public class AjusteSaldoRequestDto
    {
        [Required(ErrorMessage = "El tipo de destino es obligatorio ('Distribuidores' o 'Canillas').")]
        [RegularExpression("^(Distribuidores|Canillas)$", ErrorMessage = "Destino debe ser 'Distribuidores' o 'Canillas'.")]
        public string Destino { get; set; } = string.Empty;

        [Required(ErrorMessage = "El ID del destinatario es obligatorio.")]
        [Range(1, int.MaxValue, ErrorMessage = "ID de Destinatario inválido.")]
        public int IdDestino { get; set; }

        [Required(ErrorMessage = "El ID de la empresa es obligatorio.")]
        [Range(1, int.MaxValue, ErrorMessage = "ID de Empresa inválido.")]
        public int IdEmpresa { get; set; }

        [Required(ErrorMessage = "El monto del ajuste es obligatorio.")]
        // Permitir montos negativos para disminuir deuda o positivos para aumentarla
        // No se usa Range aquí para permitir ambos signos. La validación de que no sea cero se puede hacer en el servicio.
        public decimal MontoAjuste { get; set; }

        [Required(ErrorMessage = "La justificación del ajuste es obligatoria.")]
        [StringLength(250, MinimumLength = 5, ErrorMessage = "La justificación debe tener entre 5 y 250 caracteres.")]
        public string Justificacion { get; set; } = string.Empty;

        // Fecha lógica de la operación. Se valida contra el último cierre vigente
        // del par (Distribuidor + Empresa) para bloquear ajustes en períodos cerrados.
        // Distinta de FechaAjuste, que es el momento de ejecución del ajuste en el sistema.
        [Required(ErrorMessage = "La fecha de operación es obligatoria.")]
        public DateTime FechaOperacion { get; set; }
    }
}