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

namespace Bp.Sync.Domain.Entities.Inventories
{
    public class Bill : BaseEntityWithKey<long>
    {
        /// <summary>
        /// Mã phiếu
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string Code { get; set; }

        /// Mã phiếu liên quan
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string RelateCode { get; set; }

        /// ID phiếu liên quan
        /// </summary>
        public long RelateId { get; set; }

        /// <summary>
        /// Tên phiếu
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string Name { get; set; }

        /// Mã đơn hàng
        /// </summary>
        [Column(TypeName = "nvarchar(max)")]
        public string OrderCode { get; set; }

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

        /// <summary>
        /// Mã nhà cung cấp
        /// </summary>
        public int SupplierId { get; set; }

        /// <summary>
        /// Mã chi nhánh xuất hàng đến
        /// </summary>
        public int DestBranchId { get; set; }

        /// <summary>
        /// Mã chi nhánh hiện tại
        /// </summary>
        public int BranchId { get; set; }

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

        /// <summary>
        /// ID của phiếu cha
        /// </summary>
        public long ParentId { get; set; }

        /// <summary>
        /// ID vị trí
        /// </summary>
        public long LocationId { get; set; }

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

        /// <summary>
        /// Loại kiểm kho
        /// </summary>
        public InventoryType InventoryType { get; set; }

        /// <summary>
        /// Thời gian bắt đầu (thời gian trong phiếu kiểm kho)
        /// </summary>
        public DateTimeOffset? StartTime { get; set; }

        /// <summary>
        /// Thời gian kết thúc (thời gian trong phiếu kiểm kho)
        /// </summary>
        public DateTimeOffset? EndTime { get; set; }

        /// <summary>
        /// Danh sách Id liên quan
        /// </summary>
        public string RelateIds { get; set; }

        /// <summary>
        /// Danh sách Code liên quan
        /// </summary>
        [Column(TypeName = "nvarchar(max)")]
        public string RelateCodes { get; set; }

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

        /// <summary>
        /// Mô tả / lý do / diễn giải
        /// </summary>
        [Column(TypeName = "nvarchar(1024)")]
        public string Description { get; set; }

        /// <summary>
        /// Tổng tiền trả cho NCC
        /// </summary>
        [Column(TypeName = "decimal(18, 5)")]
        public decimal PaymentAmount { get; set; }

        /// <summary>
        /// Đã kiểm tra hay chưa
        /// </summary>
        public bool IsChecked { get; set; }

        /// <summary>
        /// Đã cân bằng kho?
        /// </summary>
        public bool IsBalanced { get; set; }

        /// <summary>
        /// Loại bán hàng
        /// </summary>
        public SaleType SaleType { get; set; }

        /// <summary>
        /// Có in hóa đơn hay không?
        /// </summary>
        public bool IsPrintVatInvoice { get; set; }

        /// <summary>
        /// ID của trình dược viên đặt hàng
        /// </summary>
        public int MedrepId { get; set; }

        /// <summary>
        /// Xác định đã in hóa đơn hay chưa
        /// </summary>
        public bool IsInvoicePrinted { get; set; }

        /// <summary>
        /// ID của người thu tiền
        /// </summary>
        public int CashierId { get; set; }

        /// <summary>
        /// Ngày thu tiền
        /// </summary>
        public DateTimeOffset? CashierDate { get; set; }

        /// <summary>
        /// Trạng thái thu tiền
        /// </summary>
        public CollectMoneyStatus CollectMoneyStatus { get; set; }

        /// <summary>
        /// Hình thức giao hàng
        /// </summary>
        public DeliveryType DeliveryType { get; set; }

        /// <summary>
        /// ID của người trả tiền
        /// </summary>
        public int PayerId { get; set; }

        /// <summary>
        /// Ngày trả tiền
        /// </summary>
        public DateTimeOffset? PayDate { get; set; }

        /// <summary>
        /// Số hoá đơn
        /// </summary>
        [Column(TypeName = "nvarchar(64)")]
        public string InvoiceCode { get; set; }

        /// <summary>
        /// Ngày chứng từ
        /// </summary>
        public DateTimeOffset? VocherDate { get; set; }

        /// <summary>
        /// Là phiếu nhập chi phí
        /// </summary>
        public bool IsInputCost { get; set; }

        /// <summary>
        /// Là phiếu xuất giảm giá vốn
        /// </summary>
        public bool IsOutputCost { get; set; }

        public BillSyncDavStatus SyncDavStatus { get; set; }
    }

    public enum BillStatus
    {
        [Description("Tạo mới")]
        New = 1,

        [Description("Đang xử lý")]
        Processing = 2,

        [Description("Hoàn thành")]
        Done = 3
    }

    public enum BillType
    {
        [Description("Nhập từ NCC")]
        InboundFromSupplier = 1,

        [Description("Nhập từ CN/FC")]
        InboundFromBranch = 2,

        [Description("Nhập từ khách hàng")]
        InboundFromCustomer = 3,

        [Description("Nhập cân bằng kho")]
        InboundInventoryBalance = 4,

        [Description("Nhập chuyển kho")]
        InboundInternal = 21,

        [Description("Xuất trả NCC")]
        OutboundToSupplier = 5,

        [Description("Xuất tới CN/FC")]
        OutboundToBranch = 6,

        [Description("Xuất bán")]
        OutboundToCustomer = 7,

        [Description("Xuất cân bằng kho")]
        OutboundInventoryBalance = 9,

        [Description("Xuất hủy")]
        OutboundToCancel = 11,

        [Description("Xuất giảm giá vốn")]
        OutboundReduceCostPrice = 12,

        [Description("Xuất chuyển kho")]
        OutboundInternal = 13,

        [Description("Kiểm kho")]
        Inventory = 10,
    }

    public enum InventoryType
    {
        [Description("Kiểm tất cả hàng tồn")]
        All = 1,

        [Description("Kiểm theo vị trí")]
        ByLocation = 2,

        [Description("Kiểm theo ngày nhập")]
        ByInboundTime = 3,

        [Description("Kiểm theo hóa đơn")]
        ByInvoice = 4,

        [Description("Kiểm theo nhà cung cấp")]
        BySupplier = 5,

        [Description("Kiểm theo loại thuốc")]
        ByMedicineType = 6,

        [Description("Kiểm theo nhóm thuốc")]
        ByMedicineGroup = 7,

        [Description("Kiểm theo lô")]
        ByProductionBatch = 8,

        [Description("Kiểm theo ngày bán")]
        BySaleTime = 9,

        [Description("Kiểm theo nhân viên bán")]
        ByStaff = 10,
    }

    public enum SaleType
    {
        [Description("Bán cho CN/FC")]
        Branch = 1,

        [Description("Bán buôn")]
        Wholesale = 2,

        [Description("Bán qua TDV")]
        Pharmacist = 3,

        [Description("Bán lẻ")]
        Retail = 4,

        [Description("Bán online")]
        Online = 5
    }

    public enum DeliveryType
    {
        [Description("Tự đi giao")]
        SelfDelivery = 1,

        [Description("Khách đến lấy")]
        CustomerPickup = 2,

        [Description("Gửi xe khách")]
        Coach = 3,

        [Description("Gửi Best Express")]
        BestExpress = 4,

        [Description("Gửi Viettel Post")]
        ViettelPost = 5,

        [Description("Gửi ZTO")]
        Zto = 6,

        [Description("Gửi J&T Express")]
        JTExpress = 7,

        [Description("Gửi Shopee")]
        Shopee = 8,
    }

    public enum CollectMoneyStatus
    {
        [Description("Chưa thu tiền")]
        Pending = 1,

        [Description("Đã thu tiền")]
        Collected = 2,

        [Description("Hủy thu tiền")]
        Cancel = 3
    }
}