namespace Domain.Dtos.Stock
{
    /// <summary>
    /// DTO de lectura y de impresión para una Expedición (nota de entrega).
    /// Representa la cabecera + lista de ítems listos para renderizar en UI/PDF.
    /// </summary>
    public class ExpeditionDto
    {
        // ===== Identificación / numeración =====

        /// <summary>
        /// Identificador interno de la expedición.
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// Número de expedición (ej.: EX-00000001).
        /// Lo genera el servidor al emitir según la serie.
        /// </summary>
        public string Expeditionnumber { get; set; } = string.Empty;

        // ===== Fechas / estado =====

        /// <summary>
        /// Fecha de emisión de la expedición.
        /// </summary>
        public DateTime Issuedate { get; set; }

        /// <summary>
        /// Estado numérico de la expedición (según enum del dominio).
        /// </summary>
        public int Status { get; set; }

        /// <summary>
        /// Etiqueta amigable del estado (ej.: Emitida, En tránsito, En destino, Retorno, Cerrada, Anulada).
        /// </summary>
        public string StatusLabel { get; set; } = string.Empty;

        // ===== Origen (depósito) =====

        /// <summary>
        /// Id de la ubicación/depósito desde donde se despacha.
        /// </summary>
        public int LocationId { get; set; }

        /// <summary>
        /// Nombre de la ubicación/depósito (resuelto por join).
        /// </summary>
        public string? LocationName { get; set; }

        /// <summary>
        /// (Opcional) Dirección del depósito/origen, útil para impresión.
        /// </summary>
        public string? LocationAddress { get; set; }

        // ===== Destino / referencias externas =====

        /// <summary>
        /// Nombre visible del destinatario (si se define para la impresión).
        /// </summary>
        public string? RecipientName { get; set; }

        /// <summary>
        /// Número o referencia externa asociada (si aplica).
        /// </summary>
        public string? ReferenceNumber { get; set; }

        /// <summary>
        /// Tipo de origen externo (ej.: surgery, demo, préstamo).
        /// </summary>
        public string? OriginType { get; set; }

        /// <summary>
        /// Referencia externa a otro módulo o sistema (ticket/orden).
        /// </summary>
        public string? ExternalReference { get; set; }

        /// <summary>
        /// Ticket quirúrgico asociado (si corresponde).
        /// </summary>
        public Guid? TicketId { get; set; }

        // ===== “Foto” (snapshot) de la cirugía/paciente (Extrainfo) =====

        /// <summary>
        /// Información adicional en JSON tal como se almacenó (para trazabilidad).
        /// </summary>
        public string? ExtrainfoJson { get; set; }

        // ===== Observaciones / instrucciones =====

        /// <summary>
        /// Observaciones generales de la expedición (libre).
        /// </summary>
        public string? Observations { get; set; }

        // ===== Auditoría de impresión =====

        /// <summary>
        /// Cantidad de veces que se imprimió la nota (para mostrar "Reimpresión N").
        /// </summary>
        public int Printcount { get; set; }

        /// <summary>
        /// Fecha de creación del registro (trazabilidad).
        /// </summary>
        public DateTime Createdat { get; set; }

        /// <summary>
        /// Fecha de última modificación del registro (trazabilidad).
        /// </summary>
        public DateTime? Modifiedat { get; set; }

        // ===== Ítems =====

        /// <summary>
        /// Detalle de los ítems/productos de la expedición.
        /// </summary>
        public List<ExpeditionItemDto> Items { get; set; } = new();

        // ===== Totales de conveniencia para la impresión =====

        /// <summary>
        /// Total de renglones en la expedición (Items.Count).
        /// </summary>
        public int TotalItems => Items?.Count ?? 0;

        /// <summary>
        /// Suma de cantidades (para pie de impresión).
        /// </summary>
        public decimal TotalQuantity => Items?.Sum(i => i.Quantity) ?? 0m;

        /// <summary>
        /// Logo de la compañia.
        /// </summary>
        public string LogoBase64 { get; set; } = string.Empty;
    }
}
