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;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace Lada.Framework.Data.Domains.Finance
{
    /// <summary>
    /// Hóa đơn thanh toán chuyển khoản cho các đơn hàng có PayFeeType = BankTransfer
    /// </summary>
    public class TransferPaymentBill : BaseEntityWithKey<int>
    {
        /// <summary>
        /// Mã hóa đơn (TPB-YYYYMMDD-XXX)
        /// </summary>
        [Required]
        [MaxLength(32)]
        public string Code { get; set; } = string.Empty;

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

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

        /// <summary>
        /// Tổng tiền TransferFee
        /// </summary>
        public decimal TotalAmount { get; set; }

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

        /// <summary>
        /// Trạng thái hóa đơn
        /// </summary>
        public TransferPaymentBillStatus Status { get; set; } = TransferPaymentBillStatus.Draft;

        /// <summary>
        /// Mức độ ưu tiên dựa trên thời gian tạo
        /// </summary>
        public TransferPaymentBillPriority Priority { get; set; } = TransferPaymentBillPriority.Low;

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

        /// <summary>
        /// Thông tin chuyển khoản
        /// </summary>
        [MaxLength(1024)]
        public string TransferInfo { get; set; } = string.Empty;

        #region Người duyệt

        /// <summary>
        /// Người duyệt hóa đơ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? ApprovedDate { get; set; }

        #endregion

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

        /// <summary>
        /// ID media chứng từ chuyển khoản
        /// </summary>
        public Guid? MediaId { get; set; }

        /// <summary>
        /// Media chứng từ chuyển khoản
        /// </summary>
        public virtual Media? Media { get; set; }

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

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

        #endregion

        #region Navigation Properties

        /// <summary>
        /// Danh sách đơn hàng trong hóa đơn
        /// </summary>
        public virtual ICollection<TransferPaymentBillOrder> Orders { get; set; } = new List<TransferPaymentBillOrder>();

        #endregion
    }

    /// <summary>
    /// Trạng thái hóa đơn thanh toán chuyển khoản
    /// </summary>
    public enum TransferPaymentBillStatus
    {
        [Description("Nháp")]
        Draft = 1,

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

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

    /// <summary>
    /// Mức độ ưu tiên hóa đơn thanh toán
    /// </summary>
    public enum TransferPaymentBillPriority
    {
        [Description("Thấp")]
        Low = 1,

        [Description("Trung bình")]
        Medium = 2,

        [Description("Cao")]
        High = 3
    }
}
