using Core.Interfaces.Stock;
using Domain.Dtos.Stock;
using Domain.Entities;
using Models.Interfaces;

namespace Core.Services.Stock
{
    public class ExpeditionService : IExpeditionDom
    {
        #region Declaraciones
        private readonly IExpeditionRepository _repo;
        public ExpeditionService(IExpeditionRepository repo) => _repo = repo;
        #endregion
        #region Guardado completo de expedicion (encabezado + detalles)
        public async Task<(int Id, string ExpeditionNumber)> CreateAndIssueAsync(
            ELSExpeditionHeader header,
            IEnumerable<ELSExpeditionDetail> details,
            int formSeriesId)
        {
            if (header is null) throw new ArgumentNullException(nameof(header));
            if (details is null || !details.Any())
                throw new InvalidOperationException("Debe incluir al menos un ítem.");
            if (formSeriesId <= 0)
                throw new ArgumentOutOfRangeException(nameof(formSeriesId), "Serie inválida.");

            // Reemplazo directo de la colección (más claro que Clear()+Add)
            header.PhLsmExpeditionDetails = details.ToList();

            return await _repo.CreateFullExpeditionAsync(header, formSeriesId);
        }
        #endregion
        public async Task<ExpeditionDto?> GetDtoByIdAsync(int id)
        {
            return await _repo.GetDtoByIdAsync(id);
        }
    }
}
