using Bp.Sync.Domain.Entities.BaseEntities;
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;

namespace Bp.Sync.Domain.Entities.Inventories.Generals
{
    /// <summary>
    /// Bảng chi tiết công nợ phải thu từ KH và phải trả NCC
    /// </summary>
    public class Debt : BaseEntityWithKey<long>
    {
        /// <summary>
        /// ID của KH/NCC
        /// </summary>
        public int PartnerId { get; set; }
        /// <summary>
        /// Mã
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string PartnerCode { get; set; }
        /// <summary>
        /// Tên đối tượng khác
        /// </summary>
        [Column(TypeName = "nvarchar(256)")]
        public string PartnerName2 { get; set; }
        /// <summary>
        /// Loại đối tượng
        /// </summary>
        public PartnerType PartnerType { get; set; }
        /// <summary>
        /// Ngày hạch toán
        /// </summary>
        public DateTimeOffset? AccountingDate { get; set; }
        /// <summary>
        /// Ngày chứng từ
        /// </summary>
        public DateTimeOffset? VocherDate { get; set; }
        /// <summary>
        /// Loại công nợ
        /// </summary>
        public DebtType DebtType { get; set; }
        /// <summary>
        /// Loại chứng từ
        /// </summary>
        public VocherType VocherType { get; set; }
        /// <summary>
        /// Mã chứng từ
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string VocherCode { get; set; }
        /// <summary>
        /// Diễn giải
        /// </summary>
        [Column(TypeName = "nvarchar(1024)")]
        public string Description { get; set; }
        /// <summary>
        /// Mã tài khoản công nợ
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string AccountCode { get; set; }
        /// <summary>
        /// Mã tài khoản đối ứng
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string ReciprocalAccountCode { get; set; }
        /// <summary>
        /// Giá trị phát sinh nợ
        /// </summary>
        [Column(TypeName = "decimal(18, 5)")]
        public decimal DebitIncurredValue { get; set; }
        /// <summary>
        /// Giá trị phát sinh có
        /// </summary>
        [Column(TypeName = "decimal(18, 5)")]
        public decimal CreditIncurredValue { get; set; }
        /// <summary>
        /// Giá trị số dư nợ
        /// </summary>
        [Column(TypeName = "decimal(18, 5)")]
        public decimal DebitBalanceValue { get; set; }
        /// <summary>
        /// Giá trị số dư có
        /// </summary>
        [Column(TypeName = "decimal(18, 5)")]
        public decimal CreditBalanceValue { get; set; }
        /// <summary>
        /// Giá trị số dư (trong sổ quỹ)
        /// </summary>
        [Column(TypeName = "decimal(18, 5)")]
        public decimal BalanceValue { get; set; }
        /// <summary>
        /// ID của VocherAccount
        /// </summary>
        public long VocherAccountId { get; set; }
        /// <summary>
        /// Là hạch toán kết chuyển?
        /// </summary>
        public bool IsAccountingEntry { get; set; }
    }


    public enum DebtType
    {
        [Description("Phải thu")]
        Receivable = 1,
        [Description("Phải trả")]
        ToPayDebt = 2,
        [Description("Sổ quỹ tiền mặt")]
        CashBook = 3,
        [Description("Sổ quỹ tiền ngân hàng")]
        BankCashBook = 4,

        [Description("Loại khác")]
        Other = 9
    }

    public enum VocherType
    {
        [Description("Phiếu thu")]
        Receipt = 1,
        [Description("Phiếu chi")]
        Payment = 2,
        [Description("Phiếu kế toán")]
        Accounting = 3,
        [Description("Giấy báo nợ")]
        Debit = 4,
        [Description("Giấy báo có")]
        Credit = 5,
        [Description("Phiếu nhập")]
        Inbound = 6,
        [Description("Phiếu xuất")]
        Outbound = 7,
        [Description("Phiếu báo tăng")]
        Import = 8,
        [Description("Phiếu báo giảm")]
        Export = 9,
    }

    public enum PartnerType
    {
        [Description("Nhà cung cấp")]
        Supplier = 1,
        [Description("Khách hàng")]
        Customer = 2,
        [Description("Nhân viên")]
        User = 3,
        [Description("Chi nhánh")]
        Branch = 4,
    }
}
