using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;

namespace GestionIntegral.Api.Dtos.Distribucion
{
    [CustomValidation(typeof(CreateBulkEntradaSalidaCanillaDto), nameof(ValidateNoDuplicatePublicationsInItems))]
    public class CreateBulkEntradaSalidaCanillaDto
    {
        [Required(ErrorMessage = "El ID del canillita es obligatorio.")]
        public int IdCanilla { get; set; }

        [Required(ErrorMessage = "La fecha del movimiento es obligatoria.")]
        public DateTime Fecha { get; set; }

        [Required(ErrorMessage = "Debe haber al menos un ítem de movimiento.")]
        [MinLength(1, ErrorMessage = "Debe agregar al menos una publicación.")]
        // La validación de cada item se hará por los atributos en EntradaSalidaCanillaItemDto
        public List<EntradaSalidaCanillaItemDto> Items { get; set; } = new List<EntradaSalidaCanillaItemDto>();
        
        public static ValidationResult? ValidateNoDuplicatePublicationsInItems(CreateBulkEntradaSalidaCanillaDto instanceToValidate, ValidationContext context)
        {
            if (instanceToValidate == null) 
            {
                return new ValidationResult("El objeto principal de la solicitud es nulo.");
            }

            if (instanceToValidate.Items == null) 
            {
                 return ValidationResult.Success; // O error si una lista nula de items es inválida
            }

            if (instanceToValidate.Items.Any()) 
            {
                if (instanceToValidate.Items.Any(item => item == null))
                {
                    return new ValidationResult("La lista de ítems contiene entradas nulas.", new[] { nameof(Items) });
                }

                var duplicateGroups = instanceToValidate.Items
                    .Where(item => item.IdPublicacion != 0) // Considerar solo IDs válidos si 0 no lo es
                    .GroupBy(item => item.IdPublicacion) 
                    .Where(group => group.Count() > 1)
                    .ToList();

                if (duplicateGroups.Any())
                {
                    var duplicatedIds = string.Join(", ", duplicateGroups.Select(g => g.Key));
                    return new ValidationResult(
                        $"No puede agregar la misma publicación varias veces. Publicaciones duplicadas IDs: {duplicatedIds}",
                        new[] { nameof(Items) } 
                    );
                }
            }
            return ValidationResult.Success;
        }
    }
}