using System.ComponentModel.DataAnnotations;
using Lada.Framework.Data.Domains.Finance;
using Lada.Framework.DTO;
using Lada.Framework.Infrastructures.Helpers;

namespace Ladaer.BackEnd.Infrastructures.DTO.Items.Finance
{
    /// <summary>
    /// DTO hiển thị danh sách phiếu đối soát khách hàng
    /// </summary>
    public class CustomerReconciliationSlipItem : BaseItem<int>
    {
        /// <summary>
        /// Mã phiếu
        /// </summary>
        public string Code { 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>
        /// Số điện thoại khách hàng
        /// </summary>
        public string CustomerPhone { get; set; } = string.Empty;

        /// <summary>
        /// Loại phiếu
        /// </summary>
        public CustomerReconciliationSlipType Type { get; set; }

        /// <summary>
        /// Tên loại phiếu
        /// </summary>
        public string TypeName => Type.GetDescription();

        /// <summary>
        /// Trạng thái
        /// </summary>
        public CustomerReconciliationSlipStatus Status { get; set; }

        /// <summary>
        /// Tên trạng thái
        /// </summary>
        public string StatusName => Status.GetDescription();

        /// <summary>
        /// Tổng tiền thu hộ COD
        /// </summary>
        public decimal TotalCodAmount { get; set; }

        /// <summary>
        /// Tổng phí vận chuyển
        /// </summary>
        public decimal TotalFeeAmount { get; set; }

        /// <summary>
        /// Số tiền cuối cùng
        /// </summary>
        public decimal FinalAmount { get; set; }

        public string FinalAmountFormatted => FinalAmount.FormatCurrency();

        /// <summary>
        /// Số lượng đơn hàng
        /// </summary>
        public int OrderCount { get; set; }

        /// <summary>
        /// Người tạo
        /// </summary>
        public string CreatedByUserName { get; set; } = string.Empty;

        /// <summary>
        /// Thời gian tạo
        /// </summary>
        public DateTimeOffset CreatedTime { get; set; }

        /// <summary>
        /// Người duyệt
        /// </summary>
        public string ApprovedByUsername { get; set; } = string.Empty;

        /// <summary>
        /// Thời gian duyệt
        /// </summary>
        public DateTimeOffset? ApprovedTime { get; set; }

        /// <summary>
        /// Người hoàn thành
        /// </summary>
        public string CompletedByUsername { get; set; } = string.Empty;

        /// <summary>
        /// Thời gian hoàn thành
        /// </summary>
        public DateTimeOffset? CompletedTime { get; set; }

        /// <summary>
        /// Ghi chú nội bộ
        /// </summary>
        public string InternalNote { get; set; } = string.Empty;

        /// <summary>
        /// Phương thức thanh toán
        /// </summary>
        public string PaymentMethod { get; set; } = string.Empty;

        /// <summary>
        /// Mã giao dịch
        /// </summary>
        public string TransactionCode { get; set; } = string.Empty;

        /// <summary>
        /// Link ảnh chứng từ
        /// </summary>
        public string ProofImageUrl { get; set; } = string.Empty;

        #region Thông tin tài khoản ngân hàng nhận tiền (chỉ dùng cho phiếu Receivable)

        /// <summary>
        /// ID tài khoản ngân hàng khách hàng
        /// </summary>
        public int? CustomerBankAccountId { get; set; }

        /// <summary>
        /// Số tài khoản ngân hàng
        /// </summary>
        public string? BankAccountNumber { get; set; }

        /// <summary>
        /// Tên chủ tài khoản
        /// </summary>
        public string? BankAccountHolderName { get; set; }

        /// <summary>
        /// Mã ngân hàng (VCB, TCB, VTB, etc.)
        /// </summary>
        public string? BankCode { get; set; }

        /// <summary>
        /// Tên ngân hàng
        /// </summary>
        public string? BankName { get; set; }

        /// <summary>
        /// Tên chi nhánh ngân hàng
        /// </summary>
        public string? BankBranchName { get; set; }

        /// <summary>
        /// Địa chỉ chi nhánh ngân hàng
        /// </summary>
        public string? BankBranchAddress { get; set; }

        /// <summary>
        /// Thông tin hiển thị đầy đủ của tài khoản nhận tiền
        /// </summary>
        public string? BankAccountDisplay => !string.IsNullOrEmpty(BankAccountNumber)
            ? $"{BankAccountHolderName} - {BankAccountNumber} ({BankName})"
            : null;

        #endregion

        #region Thông tin hóa đơn

        /// <summary>
        /// Phiếu có hóa đơn hay không
        /// </summary>
        public bool HasTaxInvoice { get; set; }

        /// <summary>
        /// Trạng thái hóa đơn (nếu có)
        /// </summary>
        public TaxInvoiceStatus? TaxInvoiceStatus { get; set; }

        /// <summary>
        /// Tên trạng thái hóa đơn
        /// </summary>
        public string? TaxInvoiceStatusName => TaxInvoiceStatus?.GetDescription();

        #endregion
    }

    /// <summary>
    /// DTO chi tiết đơn hàng trong phiếu
    /// </summary>
    public class CustomerReconciliationSlipDetailItem : BaseItem<int>
    {
        public int CustomerReconciliationSlipId { get; set; }
        public int OrderId { get; set; }
        public string OrderCode { get; set; } = string.Empty;
        public string PartnerCode { get; set; } = string.Empty;
        public string CustomerCode { get; set; } = string.Empty;

        public decimal AppliedCodAmount { get; set; }
        public decimal AppliedFeeAmount { get; set; }
        public decimal NetAmount { get; set; }

        public DateTimeOffset? DeliveredDate { get; set; }
        public DateTimeOffset? CodCollectedDate { get; set; }

        public string OrderStatus { get; set; } = string.Empty;
        public string OrderStatusCssClass { get; set; } = string.Empty;
        public string PhysicalStatus { get; set; } = string.Empty;
        public string PhysicalStatusCssClass { get; set; } = string.Empty;

        public decimal ChargeWeight { get; set; }
        public decimal ShippingFee { get; set; }

        public string SenderAddress { get; set; } = string.Empty;
        public string SenderName { get; set; } = string.Empty;
        public string SenderPhone { get; set; } = string.Empty;

        public string DeliveryAddress { get; set; } = string.Empty;
        public string ReceiverName { get; set; } = string.Empty;
        public string ReceiverPhone { get; set; } = string.Empty;

        public string Note { get; set; } = string.Empty;
        public string ProductInfo { get; set; } = string.Empty;
    }

    /// <summary>
    /// DTO lịch sử thao tác
    /// </summary>
    public class CustomerReconciliationLogItem : BaseItem<int>
    {
        public int CustomerReconciliationSlipId { get; set; }
        public int ActorId { get; set; }
        public string ActorUsername { get; set; } = string.Empty;
        public CustomerReconciliationActionType ActionType { get; set; }
        public string ActionTypeName => ActionType.GetDescription();
        public string OldStatus { get; set; } = string.Empty;
        public string NewStatus { get; set; } = string.Empty;
        public string Note { get; set; } = string.Empty;
        public DateTimeOffset CreatedTime { get; set; }
    }
}
