using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Lada.Framework.Data.Domains.BaseEntities;
using Lada.Framework.Data.Domains.Crm;
using Lada.Framework.Data.Domains.Finance.Wallets;
using Lada.Framework.Data.Domains.Medias;

namespace Lada.Framework.Data.Domains.Finance
{
    /// <summary>
    /// Phiếu đối soát khách hàng (Customer Reconciliation Slip)
    /// Quản lý dòng tiền giữa công ty và khách hàng
    /// </summary>
    public class CustomerReconciliationSlip : BaseEntityWithKey<int>
    {
        /// <summary>
        /// Mã phiếu (CR-YYYYMMDD-XXX)
        /// </summary>
        [Required]
        [MaxLength(32)]
        public string Code { get; set; } = string.Empty;

        /// <summary>
        /// Khách hàng
        /// </summary>
        public int CustomerId { get; set; }
        public virtual Customer Customer { get; set; }

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

        /// <summary>
        /// Trạng thái phiếu
        /// </summary>
        public CustomerReconciliationSlipStatus Status { get; set; } = CustomerReconciliationSlipStatus.Draft;

        #region Financial Summary

        /// <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 = |TotalCodAmount - TotalFeeAmount|
        /// </summary>
        public decimal FinalAmount { get; set; }

        #endregion

        #region Payment Information

        /// <summary>
        /// Phương thức thanh toán (tên ngân hàng/ví)
        /// </summary>
        [MaxLength(256)]
        public string PaymentMethod { get; set; } = string.Empty;

        /// <summary>
        /// URL ảnh chứng từ thanh toán
        /// </summary>
        [MaxLength(1024)]
        public string ProofImageUrl { get; set; } = string.Empty;

        /// <summary>
        /// Mã giao dịch ngân hàng
        /// </summary>
        [MaxLength(128)]
        public string TransactionCode { get; set; } = string.Empty;

        #endregion

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

        /// <summary>
        /// ID tài khoản ngân hàng khách hàng (chỉ để reference)
        /// </summary>
        public int? CustomerBankAccountId { get; set; }
        public virtual CustomerBankAccount? CustomerBankAccount { get; set; }

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

        /// <summary>
        /// Tên chủ tài khoản
        /// </summary>
        [MaxLength(256)]
        public string? BankAccountHolderName { get; set; }

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

        /// <summary>
        /// Tên ngân hàng
        /// </summary>
        [MaxLength(256)]
        public string? BankName { get; set; }

        /// <summary>
        /// Tên chi nhánh ngân hàng
        /// </summary>
        [MaxLength(256)]
        public string? BankBranchName { get; set; }

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

        #endregion

        #region Notes

        /// <summary>
        /// Ghi chú nội bộ (Sale note cho Kế toán hoặc Kế toán note lý do từ chối)
        /// </summary>
        [MaxLength(2048)]
        public string InternalNote { get; set; } = string.Empty;

        #endregion

        #region Approval & Completion

        /// <summary>
        /// Người duyệt phiếu (Kế toán)
        /// </summary>
        public int? ApprovedBy { get; set; }

        /// <summary>
        /// Tên người duyệt
        /// </summary>
        [MaxLength(128)]
        public string ApprovedByUsername { get; set; } = string.Empty;

        /// <summary>
        /// Ngày duyệt
        /// </summary>
        public DateTimeOffset? ApprovedTime { get; set; }

        /// <summary>
        /// Người xác nhận hoàn thành (Thu/Chi tiền)
        /// </summary>
        public int? CompletedBy { get; set; }

        /// <summary>
        /// Tên người xác nhận hoàn thành
        /// </summary>
        [MaxLength(128)]
        public string CompletedByUsername { get; set; } = string.Empty;

        /// <summary>
        /// Ngày hoàn thành
        /// </summary>
        public DateTimeOffset? CompletedTime { get; set; }

        #endregion

        #region Media và Giao dịch liên kết

        /// <summary>
        /// ID media chứng từ
        /// </summary>
        public Guid? MediaId { get; set; }
        public virtual Media? Media { get; set; }

        /// <summary>
        /// Giao dịch liên kết
        /// </summary>
        public Guid? TransactionId { get; set; }
        public virtual Transaction? Transaction { get; set; }

        /// <summary>
        /// Hóa đơn thuế
        /// </summary>
        public int? TaxInvoiceId { get; set; }
        public virtual TaxInvoice? TaxInvoice { get; set; }

        #endregion

        #region Navigation Properties

        /// <summary>
        /// Danh sách đơn hàng trong phiếu
        /// </summary>
        public virtual ICollection<CustomerReconciliationSlipDetail> Details { get; set; } = new List<CustomerReconciliationSlipDetail>();

        /// <summary>
        /// Lịch sử thao tác
        /// </summary>
        public virtual ICollection<CustomerReconciliationLog> Logs { get; set; } = new List<CustomerReconciliationLog>();

        #endregion

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

    /// <summary>
    /// Loại phiếu đối soát khách hàng
    /// </summary>
    public enum CustomerReconciliationSlipType
    {
        [Description("Phiếu thanh toán")]
        Receivable = 1,

        [Description("Phiếu thu tiền")]
        Payable = 2
    }

    /// <summary>
    /// Trạng thái phiếu đối soát khách hàng
    /// </summary>
    public enum CustomerReconciliationSlipStatus
    {
        [Description("Nháp")]
        Draft = 1,

        [Description("Chờ duyệt")]
        PendingApproval = 2,

        [Description("Đã duyệt")]
        Approved = 3,

        [Description("Hoàn thành")]
        Completed = 4,

        [Description("Từ chối")]
        Rejected = 8
    }
}
