using Lada.Framework.DTO;
using Lada.Framework.Infrastructures.Helpers;

namespace Ladaer.BackEnd.Infrastructures.DTO.Items.Finance
{
    /// <summary>
    /// DTO item cho việc xuất Excel thông tin đơn hàng
    /// </summary>
    public class TransferPaymentBillExportOrderItem : BaseItem<int>
    {
        #region Thông tin chung
        /// <summary>
        /// ID đơn hàng
        /// </summary>
        public int OrderId { get; set; }

        /// <summary>
        /// Mã đơn hàng
        /// </summary>
        public string OrderCode { get; set; } = string.Empty;

        /// <summary>
        /// Mã đối tác
        /// </summary>
        public string PartnerCode { get; set; } = string.Empty;

        /// <summary>
        /// Ghi chú đơn hàng
        /// </summary>
        public string Note { get; set; } = string.Empty;

        /// <summary>
        /// ID khách hàng
        /// </summary>
        public int CustomerId { get; set; }

        /// <summary>
        /// Tên khách hàng
        /// </summary>
        public string CustomerName { get; set; } = string.Empty;

        /// <summary>
        /// ID Sale
        /// </summary>
        public int SaleId { get; set; }

        /// <summary>
        /// Tên Sale
        /// </summary>
        public string SaleName { get; set; } = string.Empty;
        #endregion

        #region Thông tin địa chỉ
        /// <summary>
        /// Tên người gửi
        /// </summary>
        public string SenderName { get; set; } = string.Empty;

        /// <summary>
        /// Địa chỉ người gửi
        /// </summary>
        public string SenderAddress { get; set; } = string.Empty;

        /// <summary>
        /// Số điện thoại người gửi
        /// </summary>
        public string SenderPhone { get; set; } = string.Empty;

        /// <summary>
        /// Tên người nhận
        /// </summary>
        public string ReceiverName { get; set; } = string.Empty;

        /// <summary>
        /// Địa chỉ người nhận
        /// </summary>
        public string ReceiverAddress { get; set; } = string.Empty;

        /// <summary>
        /// Số điện thoại người nhận
        /// </summary>
        public string ReceiverPhone { get; set; } = string.Empty;
        #endregion

        #region Thông tin trạng thái
        /// <summary>
        /// Trạng thái đơn hàng
        /// </summary>
        public string OrderStatus { get; set; } = string.Empty;

        /// <summary>
        /// Trạng thái vật lý đơn hàng
        /// </summary>
        public string OrderPhysicalStatus { get; set; } = string.Empty;
        #endregion

        #region Thông tin cước phí
        /// <summary>
        /// Khối lượng tính cước (gram)
        /// </summary>
        public int ChargeWeight { get; set; }

        /// <summary>
        /// Khối lượng tính cước (kg) - hiển thị
        /// </summary>
        public decimal ChargeWeightKg => ChargeWeight / 1000m;

        /// <summary>
        /// Cước phí vận chuyển
        /// </summary>
        public decimal Fee { get; set; }

        /// <summary>
        /// Cước phí vận chuyển (formatted)
        /// </summary>
        public string FeeFormatted => Fee.FormatCurrency();

        /// <summary>
        /// Phí COD
        /// </summary>
        public decimal CodFee { get; set; }

        /// <summary>
        /// Phí COD (formatted)
        /// </summary>
        public string CodFeeFormatted => CodFee.FormatCurrency();

        /// <summary>
        /// Phí lấy hàng
        /// </summary>
        public decimal PickupSubFee { get; set; }

        /// <summary>
        /// Phí lấy hàng (formatted)
        /// </summary>
        public string PickupSubFeeFormatted => PickupSubFee.FormatCurrency();

        /// <summary>
        /// Phí giao hàng
        /// </summary>
        public decimal DeliverySubFee { get; set; }

        /// <summary>
        /// Phí giao hàng (formatted)
        /// </summary>
        public string DeliverySubFeeFormatted => DeliverySubFee.FormatCurrency();

        /// <summary>
        /// Giảm giá
        /// </summary>
        public decimal Discount { get; set; }

        /// <summary>
        /// Giảm giá (formatted)
        /// </summary>
        public string DiscountFormatted => Discount.FormatCurrency();

        /// <summary>
        /// Tổng cước phí
        /// </summary>
        public decimal TotalFee { get; set; }

        /// <summary>
        /// Tổng cước phí (formatted)
        /// </summary>
        public string TotalFeeFormatted => TotalFee.FormatCurrency();

        /// <summary>
        /// Loại thanh toán cước phí
        /// </summary>
        public string PayFeeType { get; set; } = string.Empty;
        #endregion

        #region Thông tin thu hộ
        /// <summary>
        /// Số tiền thu hộ
        /// </summary>
        public decimal CollectAmount { get; set; }

        /// <summary>
        /// Số tiền thu hộ (formatted)
        /// </summary>
        public string CollectAmountFormatted => CollectAmount.FormatCurrency();

        /// <summary>
        /// COD có bao gồm cước phí không
        /// </summary>
        public bool CodIncludeFee { get; set; }

        /// <summary>
        /// Trạng thái thu COD
        /// </summary>
        public string CodStage { get; set; } = string.Empty;
        #endregion

        #region Thông tin tài chính
        /// <summary>
        /// Số tiền TransferFee
        /// </summary>
        public decimal TransferFeeAmount { get; set; }

        /// <summary>
        /// Số tiền TransferFee (formatted)
        /// </summary>
        public string TransferFeeAmountFormatted => TransferFeeAmount.FormatCurrency();

        /// <summary>
        /// Trạng thái TransferFee
        /// </summary>
        public string TransferFeeStage { get; set; } = string.Empty;

        /// <summary>
        /// Cước phí nguồn
        /// </summary>
        public decimal SourceFee { get; set; }

        /// <summary>
        /// Cước phí nguồn (formatted)
        /// </summary>
        public string SourceFeeFormatted => SourceFee.FormatCurrency();

        /// <summary>
        /// Trạng thái cước phí nguồn
        /// </summary>
        public string SourceFeeStage { get; set; } = string.Empty;

        /// <summary>
        /// Cước phí đích
        /// </summary>
        public decimal DestFee { get; set; }

        /// <summary>
        /// Cước phí đích (formatted)
        /// </summary>
        public string DestFeeFormatted => DestFee.FormatCurrency();

        /// <summary>
        /// Trạng thái cước phí đích
        /// </summary>
        public string DestFeeStage { get; set; } = string.Empty;

        /// <summary>
        /// Số tiền đối soát
        /// </summary>
        public decimal ReconciliationAmount { get; set; }

        /// <summary>
        /// Số tiền đối soát (formatted)
        /// </summary>
        public string ReconciliationAmountFormatted => ReconciliationAmount.FormatCurrency();
        #endregion

        #region Thông tin thời gian
        /// <summary>
        /// Thời gian tạo đơn hàng
        /// </summary>
        public DateTimeOffset? OrderCreatedTime { get; set; }

        /// <summary>
        /// Thời gian tạo đơn hàng (formatted)
        /// </summary>
        public string OrderCreatedTimeFormatted => OrderCreatedTime?.ToString("dd/MM/yyyy HH:mm") ?? "";

        /// <summary>
        /// Thời gian lấy hàng thành công
        /// </summary>
        public DateTimeOffset? PickupTime { get; set; }

        /// <summary>
        /// Thời gian lấy hàng thành công (formatted)
        /// </summary>
        public string PickupTimeFormatted => PickupTime?.ToString("dd/MM/yyyy HH:mm") ?? "";

        /// <summary>
        /// Thời gian giao hàng thành công
        /// </summary>
        public DateTimeOffset? DeliveryTime { get; set; }

        /// <summary>
        /// Thời gian giao hàng thành công (formatted)
        /// </summary>
        public string DeliveryTimeFormatted => DeliveryTime?.ToString("dd/MM/yyyy HH:mm") ?? "";
        #endregion

        #region Thông tin hàng hóa
        /// <summary>
        /// Tổng số kiện
        /// </summary>
        public int TotalPackages { get; set; }

        /// <summary>
        /// Tổng khối lượng (gram)
        /// </summary>
        public int TotalWeight { get; set; }

        /// <summary>
        /// Tổng khối lượng (kg) - hiển thị
        /// </summary>
        public decimal TotalWeightKg => TotalWeight / 1000m;

        /// <summary>
        /// Nội dung hàng hóa
        /// </summary>
        public string PackageContent { get; set; } = string.Empty;
        #endregion
    }
}
