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

namespace Lada.Framework.Data.Domains.Finance
{
    /// <summary>
    /// Bảng đối soát đơn hàng
    /// </summary>
    public class Reconciliation : BaseEntityWithKey<int>
    {
        /// <summary>
        /// Mã đối soát (RC240101001)
        /// </summary>
        [MaxLength(64)]
        public string Code { get; set; } = string.Empty;

        /// <summary>
        /// Khách hàng được đối soát
        /// </summary>
        public int CustomerId { get; set; }
        public virtual Customer Customer { get; set; }

        /// <summary>
        /// Từ ngày (đối soát các đơn từ ngày này)
        /// </summary>
        public DateTimeOffset FromDate { get; set; }

        /// <summary>
        /// Đến ngày (đối soát các đơn đến ngày này)
        /// </summary>
        public DateTimeOffset ToDate { get; set; }

        /// <summary>
        /// Ngày chuyển tiền thực tế
        /// </summary>
        public DateTimeOffset? TransferDate { get; set; }

        /// <summary>
        /// Tổng tiền COD của tất cả đơn hàng
        /// </summary>
        public decimal TotalCodAmount { get; set; }

        /// <summary>
        /// Tổng phí trừ (phí dịch vụ, phí chuyển khoản, etc.)
        /// </summary>
        public decimal TotalFeeAmount { get; set; }

        /// <summary>
        /// Số tiền thực tế chuyển cho khách hàng = TotalCodAmount - TotalFeeAmount
        /// </summary>
        public decimal NetAmount { get; set; }

        /// <summary>
        /// Trạng thái đối soát
        /// </summary>
        public ReconciliationStatus Status { get; set; } = ReconciliationStatus.Draft;

        /// <summary>
        /// Loại phiếu đối soát
        /// </summary>
        public ReconciliationType Type { get; set; } = ReconciliationType.CollectMoney;

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



        /// <summary>
        /// Người phê duyệt đối soát
        /// </summary>
        public int? ApprovedBy { get; set; }

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

        /// <summary>
        /// Người thực hiện chuyển tiền
        /// </summary>
        public int? TransferredBy { get; set; }

        /// <summary>
        /// Tên người thực hiện chuyển tiền
        /// </summary>
        [MaxLength(128)]
        public string TransferredByUsername { get; set; } = string.Empty;

        /// <summary>
        /// Ghi chú đối soát
        /// </summary>
        [MaxLength(1024)]
        public string Note { get; set; } = string.Empty;

        /// <summary>
        /// Số tài khoản ngân hàng (snapshot tại thời điểm tạo đối soát)
        /// </summary>
        [MaxLength(64)]
        public string BankAccountNumber { get; set; } = string.Empty;

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

        /// <summary>
        /// Mã ngân hàng (snapshot)
        /// </summary>
        [MaxLength(16)]
        public string BankCode { get; set; } = string.Empty;

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

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

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

        /// <summary>
        /// Thông tin chuyển khoản bổ sung (ghi chú, mã giao dịch, etc.)
        /// </summary>
        [MaxLength(1024)]
        public string TransferInfo { get; set; } = string.Empty;

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

        /// <summary>
        /// Danh sách đơn hàng trong đối soát
        /// </summary>
        public virtual ICollection<ReconciliationOrder> Orders { get; set; } = new List<ReconciliationOrder>();

        /// <summary>
        /// Giao dịch chuyển tiền (nếu đã chuyển)
        /// </summary>
        public Guid? TransactionId { get; set; }
        public virtual Transaction? Transaction { get; set; }
    }

    /// <summary>
    /// Trạng thái đối soát
    /// </summary>
    public enum ReconciliationStatus
    {
        [Description("Nháp")]
        Draft = 1,

        [Description("Đã xác nhận")]
        Confirmed = 2,

        [Description("Đã chuyển tiền")]
        Transferred = 3,

        [Description("Đã hủy")]
        Cancelled = 8
    }

    /// <summary>
    /// Loại phiếu đối soát
    /// </summary>
    public enum ReconciliationType
    {
        [Description("Đối soát tiền thu hộ")]
        CollectMoney = 1,

        [Description("Đối soát cước")]
        ShippingFee = 2
    }
}
