using Lada.Framework.Data.Domains.BaseEntities;
using System.ComponentModel.DataAnnotations;
using static Lada.Framework.Data.Enums.OrderFinEnum;

namespace Lada.Framework.Data.Domains.Orders
{
    public class OrderFin : BaseEntityWithKey<int>
    {
        #region Relation
        public virtual Order Order { get; set; }
        #endregion

        #region Trọng lượng tính cước

        /// <summary>
        /// Trọng lượng dùng để tính cước
        /// </summary>
        public decimal ChargeWeight { get; set; }

        #endregion

        #region Tiền thu hộ
        public decimal CollectAmount { get; set; }

        /// <summary>
        /// Tiền bảo hiểm   
        /// </summary>
        public decimal InsuranceAmount { get; set; }

        /// <summary>
        /// Tiền COD bao gồm cước
        /// True: Đã bao gồm cước, chỉ thu COD xong trừ cước rồi ck cho người gửi
        /// False: Chưa bao gồm: khi thu tiền thu thêm cước rồi ck cho ng gửi tiền thu hộ
        /// Mặc định là đã bao gồm
        /// </summary>
        //public bool CodIncludeFee { get; set; } = true; => Bỏ đi vì không cần sử dụng, thay thế bằng PayFeeType = COD 

        /// <summary>
        /// Người giữ tiền COD
        /// </summary>
        public int CodCashierId { get; set; }

        [MaxLength(64)]
        public string CodCashierUsername { get; set; } = string.Empty;

        /// <summary>
        /// Giai đoạn hiện tại của tiền thu hộ
        /// </summary>
        public OrderCodStage CodStage { get; set; } = OrderCodStage.NotCollected;
        #endregion

        #region Bên thanh toán
        /// <summary>
        /// 1 - Bên nhận
        /// 2 - Bên gửi
        /// 3 - Chuyển khoản kế toán
        /// 4 - Chia phí 2 bên
        /// 5 - Cấn trừ COD
        /// </summary>
        public PayFeeType PayFeeType { get; set; }

        /// <summary>
        /// Người giữ tiền cước thu người gửi
        /// </summary>
        public int SourceFeeCashierId { get; set; }

        [MaxLength(64)]
        public string SourceFeeCashierUsername { get; set; } = string.Empty;

        /// <summary>
        /// Người giữ tiền cước thu người nhận
        /// </summary>
        public int DestFeeCashierId { get; set; }

        [MaxLength(64)]
        public string DestFeeCashierUsername { get; set; } = string.Empty;
        #endregion

        #region Original Cashier - Người thu tiền ban đầu (Audit Trail)
        /// <summary>
        /// Người thu cước lấy hàng ban đầu (không thay đổi khi nộp tiền)
        /// Dùng để audit trail và hiển thị lịch sử cho driver
        /// </summary>
        public int? OriginalSourceFeeCashierId { get; set; }

        [MaxLength(64)]
        public string OriginalSourceFeeCashierUsername { get; set; } = string.Empty;

        /// <summary>
        /// Thời gian thu cước lấy hàng lần đầu
        /// </summary>
        public DateTimeOffset? SourceFeeCollectedTime { get; set; }

        /// <summary>
        /// Người thu cước giao hàng ban đầu (không thay đổi khi nộp tiền)
        /// Dùng để audit trail và hiển thị lịch sử cho driver
        /// </summary>
        public int? OriginalDestFeeCashierId { get; set; }

        [MaxLength(64)]
        public string OriginalDestFeeCashierUsername { get; set; } = string.Empty;

        /// <summary>
        /// Thời gian thu cước giao hàng lần đầu
        /// </summary>
        public DateTimeOffset? DestFeeCollectedTime { get; set; }

        /// <summary>
        /// Người thu tiền COD ban đầu (không thay đổi khi nộp tiền)
        /// Dùng để audit trail và hiển thị lịch sử cho driver
        /// </summary>
        public int? OriginalCodCashierId { get; set; }

        [MaxLength(64)]
        public string OriginalCodCashierUsername { get; set; } = string.Empty;

        /// <summary>
        /// Thời gian thu tiền COD lần đầu
        /// </summary>
        public DateTimeOffset? CodCollectedTime { get; set; }
        #endregion

        #region Tiền cước

        /// <summary>
        /// Cước giao hàng chính
        /// </summary>
        public decimal Fee { get; set; }

        /// <summary>
        /// Giảm giá
        /// </summary>
        public decimal Discount { 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í thu hộ
        /// </summary>
        public decimal CodFee { get; set; }

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

        /// <summary>
        /// Phí khai giá
        /// </summary>
        public decimal InsuranceFee { get; set; }

        

        /// <summary>
        /// ID thông tin xuất hóa đơn VAT (null nếu không xuất VAT)
        /// </summary>
        public int? VatInfoId { get; set; }

        

        /// <summary>
        /// Tổng cước sau VAT (bao gồm VAT)
        /// </summary>
        public decimal TotalFeeAfterVat => Fee + PickupSubFee + DeliverySubFee + CodFee + InsuranceFee + ReturnFee - Discount;

        /// <summary>
        /// Phí VAT - được tính đối với các đơn xuất VAT
        /// </summary>
        public decimal VatFee { get; set; }

        /// <summary>
        /// Tổng cước trước VAT
        /// </summary>
        public decimal TotalFeeBeforeVat => TotalFeeAfterVat - VatFee;

        /// <summary>
        /// Tổng tiền thanh toán (backward compatibility - giống TotalFeeAfterVat)
        /// </summary>
        public decimal TotalFee => TotalFeeAfterVat;

        /// <summary>
        /// Tiền đối soát dựa trên PayFeeType
        /// - SenderPay (1): Tiền đối soát = CollectAmount
        /// - ConsigneePay (2): Tiền đối soát = CollectAmount
        /// - BankTransfer (3): Tiền đối soát = CollectAmount
        /// - SplitPay (4): Tiền đối soát = CollectAmount
        /// - COD (5): Tiền đối soát = CollectAmount - TotalFee
        /// </summary>
        public decimal ReconciliationAmount
        {
            get
            {
                switch (PayFeeType)
                {
                    case PayFeeType.SenderPay:
                    case PayFeeType.ConsigneePay:
                    case PayFeeType.BankTransfer:
                    case PayFeeType.SplitPay:
                        return CollectAmount;
                    case PayFeeType.COD:
                        return CollectAmount - TotalFee;
                    default:
                        return CollectAmount;
                }
            }
        }




        /// <summary>
        /// Nếu tách cước thì cước thu người gửi là bao nhiêu?
        /// </summary>
        public decimal SourceFee { get; set; }

        /// <summary>
        /// Giai đoạn hiện tại tiền cước thu từ người gửi
        /// </summary>
        public OrderFeeStage SourceFeeStage { get; set; } = OrderFeeStage.NotCollected;

        /// <summary>
        /// Nếu tách cước thì cước thu người nhận là bao nhiêu?
        /// </summary>
        public decimal DestFee { get; set; }

        /// <summary>
        /// Giai đoạn hiện tại tiền cước thu từ người nhận
        /// </summary>
        public OrderFeeStage DestFeeStage { get; set; } = OrderFeeStage.NotCollected;

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

        /// <summary>
        /// Người giữ tiền cước thu từ chuyển khoản
        /// </summary>
        public int TransferFeeCashierId { get; set; }

        [MaxLength(64)]
        public string TransferFeeCashierUsername { get; set; } = string.Empty;

        /// <summary>
        /// Giai đoạn hiện tại tiền cước thu từ chuyển khoản
        /// </summary>
        public OrderFeeStage TransferFeeStage { get; set; } = OrderFeeStage.NotCollected;


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

        /// <summary>
        /// Người giữ tiền cước thu từ chuyển khoản
        /// </summary>
        public int DeductCodFeeCashierId { get; set; }

        [MaxLength(64)]
        public string DeductCodFeeCashierUsername { get; set; } = string.Empty;

        /// <summary>
        /// Giai đoạn hiện tại tiền cước thu từ chuyển khoản
        /// </summary>
        public OrderFeeStage DeductCodFeeStage { get; set; } = OrderFeeStage.NotCollected;


        #endregion

        #region Trạng thái tiền cước
        /// <summary>
        /// Đã thanh toán cước phí hay chưa
        /// </summary>
        //public bool IsPaidFee { get; set; }
        #endregion



    }
}
