using Domain.Dtos.Stock;
using Domain.Entities;
using Domain.Generics;

namespace Models.Interfaces
{
    // 1.1 Data (Repo)
    public interface IExpeditionRepository
    {
        /// <summary>
        /// Verifica si alguno de los stock items indicados ya está asociado
        /// a otra expedición activa. Utilizado para prevenir doble traza.
        /// </summary>
        /// <param name="stockItemIds">Lista de stockitem_id a validar.</param>
        /// <param name="ignoreExpeditionId">
        /// Expedición a ignorar (usado en edición para no detectar conflicto consigo misma).
        /// </param>
        /// <returns>Lista de conflictos encontrados.</returns>
        Task<List<StockItemExpeditionConflictDto>> CheckStockItemConflictsAsync(IEnumerable<int> stockItemIds, int? ignoreExpeditionId);
        /// <summary>
        /// Crea la expedición completa (encabezado + detalles) y la deja emitida con numeración de serie.
        /// </summary>
        Task<(int Id, string Expeditionnumber)> CreateFullExpeditionAsync(ELSExpeditionHeader expedition, int formSeriesId);
        Task<ExpeditionDto?> GetDtoByIdAsync(int id);
        Task<PagedResult<ExpeditionDto>> SearchAsync(string? expeditionNumber, string? status, DateTime? issueDateFrom, DateTime? issueDateTo, int? locationId, int page, int pageSize);
        /// <summary>
        /// Pasa la expedición a En tránsito y crea las reservas de stock asociadas.
        /// La operación es transaccional y falla completa si detecta inconsistencias.
        /// </summary>
        Task MarkInTransitAsync(int expeditionId);

    }

}
