using static Lada.Framework.Data.Enums.OrderFinEnum;

namespace Lada.Framework.DTO
{
    /// <summary>
    /// Request model cho tính toán cước đơn hàng
    /// </summary>
    public class OrderFeeCalculationRequest
    {
        /// <summary>
        /// ID khách hàng
        /// </summary>
        public int CustomerId { get; set; }

        /// <summary>
        /// ID phường/xã nguồn
        /// </summary>
        public int SourceWardId { get; set; }

        /// <summary>
        /// ID phường/xã đích
        /// </summary>
        public int DestWardId { get; set; }

        /// <summary>
        /// Trọng lượng (gram)
        /// </summary>
        public decimal Weight { get; set; }

        /// <summary>
        /// Tiền thu hộ
        /// </summary>
        public decimal CollectAmount { get; set; }

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

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

        /// <summary>
        /// Phí bảo hiểm
        /// </summary>
        public decimal InsuranceFee { get; set; }

        /// <summary>
        /// Phí hoàn về
        /// </summary>
        public decimal ReturnFee { get; set; }

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

        /// <summary>
        /// Loại thanh toán
        /// </summary>
        public PayFeeType PayFeeType { get; set; }

        /// <summary>
        /// Cước người gửi trả (dùng cho SplitPay)
        /// </summary>
        public decimal SourceFee { get; set; }

        /// <summary>
        /// API key cho Google Maps
        /// </summary>
        public string ApiKey { get; set; } = string.Empty;
    }

    /// <summary>
    /// Kết quả tính cước cơ bản
    /// </summary>
    public class FeeCalculationResult : BaseResult
    {
        /// <summary>
        /// Cước vận chuyển cơ bản
        /// </summary>
        public decimal BaseFee { get; set; }

        /// <summary>
        /// Tên tuyến
        /// </summary>
        public string RouteName { get; set; } = string.Empty;
    }

    /// <summary>
    /// Kết quả tính toán cước đơn hàng chi tiết
    /// </summary>
    public class OrderFeeCalculationResult : BaseResult
    {
        /// <summary>
        /// Cước vận chuyển cơ bản
        /// </summary>
        public decimal BaseFee { get; set; }

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

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

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

        /// <summary>
        /// Phí bảo hiểm
        /// </summary>
        public decimal InsuranceFee { get; set; }

        /// <summary>
        /// Phí hoàn về
        /// </summary>
        public decimal ReturnFee { get; set; }

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

        /// <summary>
        /// Tổng cước trước VAT
        /// </summary>
        public decimal TotalFeeBeforeVat { get; set; }

        /// <summary>
        /// Phí VAT (8%)
        /// </summary>
        public decimal VatFee { get; set; }

        /// <summary>
        /// Tổng cước sau VAT
        /// </summary>
        public decimal TotalFeeAfterVat { get; set; }

        /// <summary>
        /// Cước người gửi trả
        /// </summary>
        public decimal SourceFee { get; set; }

        /// <summary>
        /// Cước người nhận trả
        /// </summary>
        public decimal DestFee { get; set; }

        /// <summary>
        /// Cước chuyển khoản
        /// </summary>
        public decimal TransferFee { get; set; }

        /// <summary>
        /// Cước cấn trừ COD
        /// </summary>
        public decimal DeductCodFee { get; set; }

        /// <summary>
        /// Tên tuyến
        /// </summary>
        public string RouteName { get; set; } = string.Empty;
    }

    /// <summary>
    /// Kết quả phân bổ cước theo loại thanh toán
    /// </summary>
    public class FeeAllocationResult
    {
        /// <summary>
        /// Cước người gửi trả
        /// </summary>
        public decimal SourceFee { get; set; }

        /// <summary>
        /// Cước người nhận trả
        /// </summary>
        public decimal DestFee { get; set; }

        /// <summary>
        /// Cước chuyển khoản
        /// </summary>
        public decimal TransferFee { get; set; }

        /// <summary>
        /// Cước cấn trừ COD
        /// </summary>
        public decimal DeductCodFee { get; set; }
    }
}
