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

namespace Bp.Sync.Domain.Elastics.Inventories
{
    public class BillElastic : ElasticBaseEntityWithKey<long>
    {
        /// <summary>
        /// Mã phiếu
        /// </summary>
        public string Code { get; set; }

        /// Mã phiếu liên quan
        /// </summary>
        public string RelateCode { get; set; }

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

        public bool IsMedrepReturn { get; set; } = false;
        public int? IdMedrepReturn { get; set; }

        /// <summary>
        /// Tên phiếu
        /// </summary>
        public string Name { get; set; }

        /// Mã đơn hàng
        /// </summary>
        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; }

        public string SupplierName { get; set; }

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

        public string DestBranchName { 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; }

        public string CustomerName { 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>
        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>
        public string Description { get; set; }

        /// <summary>
        /// Tổng tiền trả cho NCC
        /// </summary>
        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; }
    }
}