using Lada.Framework.DTO;
using Lada.Framework.Data.Domains.Orders;
using Lada.Framework.Data.Enums;
using Lada.Framework.Infrastructures.Helpers;
using System.Text.Json.Serialization;
using static Lada.Framework.Data.Enums.OrderFinEnum;

namespace Ladaer.BackEnd.Infrastructures.DTO.Items.DriverApp
{
    /// <summary>
    /// Item chứa thông tin đơn hàng tài chính của lái xe cho search có phân trang
    /// </summary>
    public class DriverFinOrderItem : BaseItem<int>
    {
        /// <summary>
        /// ID của đơ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>
        /// Số tiền cước lấy hàng (SourceFee) của đơn này
        /// </summary>
        public decimal SourceFee { get; set; }

        /// <summary>
        /// Số tiền cước giao hàng (DestFee) của đơn này
        /// </summary>
        public decimal DestFee { get; set; }

        /// <summary>
        /// Số tiền thu hộ (COD) của đơn này
        /// </summary>
        public decimal CollectAmount { get; set; }

        /// <summary>
        /// Tổng số tiền của đơn này mà driver đang cầm
        /// </summary>
        public decimal TotalAmount => SourceFee + DestFee + CollectAmount;

        /// <summary>
        /// Trạng thái đơn hàng
        /// </summary>
        public OrderStatus Status { get; set; }

        /// <summary>
        /// Trạng thái đơn hàng dạng string
        /// </summary>
        public string StatusStr => Status.GetDescription();

        /// <summary>
        /// Trạng thái vật lý đơn hàng
        /// </summary>
        public OrderPhysicalStatus PhysicalStatus { get; set; }

        /// <summary>
        /// Trạng thái vật lý dạng string
        /// </summary>
        public string PhysicalStatusStr => PhysicalStatus.GetDescription();

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

        /// <summary>
        /// Loại thanh toán cước dạng string
        /// </summary>
        public string PayFeeTypeStr => PayFeeType.GetDescription();

        /// <summary>
        /// Ngày tạo đơn hàng
        /// </summary>
        public DateTime CreatedDate { get; set; }

        /// <summary>
        /// Ngày tạo đơn hàng dạng string
        /// </summary>
        public string CreatedDateStr => CreatedDate.ToString("dd/MM/yyyy HH:mm");

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

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

        /// <summary>
        /// Tên người phụ trách (PIC)
        /// </summary>
        public string PicUserName { get; set; } = string.Empty;

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

        /// <summary>
        /// Địa chỉ lấy hàng
        /// </summary>
        public string SourceAddress { get; set; } = string.Empty;

        /// <summary>
        /// Địa chỉ giao hàng
        /// </summary>
        public string DestAddress { get; set; } = string.Empty;

        /// <summary>
        /// Loại tiền mà driver đang cầm cho đơn này
        /// </summary>
        public string CashierType { get; set; } = string.Empty;

        /// <summary>
        /// Driver có phải là người thu tiền ban đầu không
        /// </summary>
        public bool IsOriginalCashier { get; set; }

        /// <summary>
        /// Thời gian thu tiền lần đầu (nếu driver là người thu ban đầu)
        /// </summary>
        public DateTimeOffset? CollectedTime { get; set; }

        /// <summary>
        /// Thời gian thu tiền lần đầu dạng string
        /// </summary>
        public string CollectedTimeStr => CollectedTime?.ToString("dd/MM/yyyy HH:mm") ?? string.Empty;

        #region Ward IDs - Dùng để enrich địa chỉ đầy đủ (phường/quận/tỉnh)
        /// <summary>
        /// WardId của địa chỉ lấy hàng (dùng nội bộ để enrich)
        /// </summary>
        [JsonIgnore]
        public int SourceWardId { get; set; }

        /// <summary>
        /// WardId của địa chỉ giao hàng (dùng nội bộ để enrich)
        /// </summary>
        [JsonIgnore]
        public int DestWardId { get; set; }
        #endregion

        #region Contact Information - Thông tin liên hệ theo loại phí thu
        /// <summary>
        /// Tên người liên hệ (tùy theo loại phí thu)
        /// - Thu phí nguồn: Tên người gửi
        /// - Thu phí đích/COD: Tên người nhận
        /// </summary>
        public string ContactName { get; set; } = string.Empty;

        /// <summary>
        /// Số điện thoại liên hệ (tùy theo loại phí thu)
        /// </summary>
        public string ContactPhone { get; set; } = string.Empty;

        /// <summary>
        /// Địa chỉ liên hệ (tùy theo loại phí thu)
        /// - Thu phí nguồn: Địa chỉ gửi hàng
        /// - Thu phí đích/COD: Địa chỉ giao hàng
        /// </summary>
        public string ContactAddress { get; set; } = string.Empty;

        /// <summary>
        /// Loại địa chỉ hiển thị (Source/Dest)
        /// </summary>
        public string AddressType { get; set; } = string.Empty;
        #endregion

        #region Deposit Status - Trạng thái nộp tiền
        /// <summary>
        /// Trạng thái nộp tiền của lái xe cho đơn này
        /// "Chưa nộp" - Lái xe đang cầm tiền
        /// "Đã nộp" - Lái xe đã nộp tiền về
        /// </summary>
        public string DepositStatus { get; set; } = string.Empty;
        #endregion

    }
}
