using Domain.Dtos.Sales;
using Domain.Generics;

/// <summary>
/// Servicio de dominio para la gestión de consultas de Delivery Note (Remito Ventas).
/// Encapsula el acceso a datos y expone operaciones de lectura para la capa superior.
/// </summary>
public interface IDeliveryNoteDom
{
    /// <summary>
    /// Busca Delivery Notes con filtros y paginación.
    /// </summary>
    Task<PagedResult<DeliveryNoteSummaryDto>> SearchAsync(
        int? customerId,
        string? customerText,
        string? deliveryNoteNumber,
        int? quoteId,
        string? quoteNumber,
        DateTime? issueDateFrom,
        DateTime? issueDateTo,
        string? status,
        int page = 1,
        int pageSize = 50);

    /// <summary>
    /// Exporta a Excel los Delivery Notes filtrados.
    /// </summary>
    Task<byte[]> ExportFilteredToExcelAsync(DeliveryNoteSearchParams searchParams);

    /// <summary>
    /// Obtiene un Delivery Note por su identificador único.
    /// </summary>
    /// <param name="id">Identificador interno del Delivery Note.</param>
    /// <returns>
    /// El DTO <see cref="DeliveryNoteDto"/> si existe; en caso contrario, null.
    /// </returns>
    Task<DeliveryNoteDto?> GetDtoByIdAsync(int id);

    /// <summary>
    /// Obtiene un Delivery Note a partir de su número de documento.
    /// </summary>
    /// <param name="deliveryNoteNumber">Número del Delivery Note (ej: DN-00000001).</param>
    /// <returns>
    /// El DTO <see cref="DeliveryNoteDto"/> si existe; en caso contrario, null.
    /// </returns>
    Task<DeliveryNoteDto?> GetDtoByDeliveryNoteNumberAsync(string deliveryNoteNumber);

    /// <summary>
    /// Obtiene todos los Delivery Notes asociados a un presupuesto (Quote).
    /// </summary>
    /// <param name="quoteId">Identificador del presupuesto relacionado.</param>
    /// <returns>
    /// Colección de <see cref="DeliveryNoteDto"/> asociadas al presupuesto.
    /// Puede estar vacía si no existen registros.
    /// </returns>
    Task<IEnumerable<DeliveryNoteDto>> GetDtosByQuoteIdAsync(int quoteId);

    /// <summary>
    /// Valida y prepara la emisión de un Delivery Note.
    /// </summary>
    Task<DeliveryNoteCreateResponse> CreateAndIssueDeliveryNoteAsync(DeliveryNoteCreateRequest request);
}
