using Lada.Framework.DTO;

namespace Ladaer.BackEnd.Infrastructures.DTO.Items.Finances
{
    /// <summary>
    /// Item tóm tắt đối soát theo khách hàng
    /// </summary>
    public class CustomerReconciliationSummaryItem : BaseItem<int>
    {
        /// <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>
        /// Số điện thoại khách hàng
        /// </summary>
        public string CustomerPhone { get; set; } = string.Empty;

        /// <summary>
        /// Email khách hàng
        /// </summary>
        public string CustomerEmail { get; set; } = string.Empty;

        /// <summary>
        /// Số lượng đơn hàng cần đối soát
        /// </summary>
        public int PendingOrderCount { get; set; }

        /// <summary>
        /// Tổng tiền COD cần đối soát
        /// </summary>
        public decimal PendingCodAmount { get; set; }

        /// <summary>
        /// Tổng phí dự kiến trừ
        /// </summary>
        public decimal EstimatedFeeAmount { get; set; }

        /// <summary>
        /// Tổng tiền đối soát dự kiến (tính theo logic PayFeeType)
        /// </summary>
        public decimal EstimatedReconciliationAmount { get; set; }

        /// <summary>
        /// Số tiền dự kiến chuyển (sử dụng logic mới)
        /// </summary>
        public decimal EstimatedNetAmount => EstimatedReconciliationAmount;

        /// <summary>
        /// Ngày đơn hàng cũ nhất chưa đối soát
        /// </summary>
        public DateTimeOffset? OldestOrderDate { get; set; }

        /// <summary>
        /// Ngày đơn hàng mới nhất chưa đối soát
        /// </summary>
        public DateTimeOffset? LatestOrderDate { get; set; }

        /// <summary>
        /// Số lượng đối soát đã tạo
        /// </summary>
        public int CompletedReconciliationCount { get; set; }

        /// <summary>
        /// Tổng tiền đã đối soát
        /// </summary>
        public decimal CompletedReconciliationAmount { get; set; }

        /// <summary>
        /// Có tài khoản ngân hàng mặc định không
        /// </summary>
        public bool HasDefaultBankAccount { get; set; }

        /// <summary>
        /// Thông tin tài khoản ngân hàng mặc định
        /// </summary>
        public string DefaultBankAccountInfo { get; set; } = string.Empty;

        /// <summary>
        /// Có thể tạo đối soát không
        /// </summary>
        public bool CanCreateReconciliation => PendingOrderCount > 0 && PendingCodAmount > 0;

        /// <summary>
        /// Có quyền duyệt đối soát không (Reconciliation.Confirm hoặc Founder)
        /// </summary>
        public bool CanConfirm { get; set; }

        /// <summary>
        /// Có quyền cập nhật chuyển tiền đối soát không (Reconciliation.Transfer hoặc Founder)
        /// </summary>
        public bool CanTransfer { get; set; }

        /// <summary>
        /// Mức độ ưu tiên (dựa trên số tiền và thời gian)
        /// </summary>
        public ReconciliationPriority Priority
        {
            get
            {
                if (PendingCodAmount >= 50000000) // >= 50 triệu
                    return ReconciliationPriority.High;

                if (OldestOrderDate.HasValue &&
                    (DateTimeOffset.Now - OldestOrderDate.Value).TotalDays >= 7) // >= 7 ngày
                    return ReconciliationPriority.High;

                if (PendingCodAmount >= 10000000) // >= 10 triệu
                    return ReconciliationPriority.Medium;

                return ReconciliationPriority.Low;
            }
        }

        /// <summary>
        /// Mức độ ưu tiên dạng string
        /// </summary>
        public string PriorityStr => Priority switch
        {
            ReconciliationPriority.High => "Cao",
            ReconciliationPriority.Medium => "Trung bình",
            ReconciliationPriority.Low => "Thấp",
            _ => "Không xác định"
        };

        /// <summary>
        /// Màu sắc hiển thị theo mức độ ưu tiên
        /// </summary>
        public string PriorityColor => Priority switch
        {
            ReconciliationPriority.High => "red",
            ReconciliationPriority.Medium => "orange",
            ReconciliationPriority.Low => "green",
            _ => "gray"
        };
    }

    /// <summary>
    /// Mức độ ưu tiên đối soát
    /// </summary>
    public enum ReconciliationPriority
    {
        Low = 1,
        Medium = 2,
        High = 3
    }
}
