using Bp.Sync.Domain.Elastics.BaseEntities;
using Bp.Sync.Domain.Entities.Inventories;
using System;

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

        /// <summary>
        /// Id sản phẩm
        /// </summary>
        public long ProductId { get; set; }

        /// <summary>
        /// Id đơn vị tính
        /// </summary>
        public int UnitId { get; set; }

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

        /// <summary>
        /// Id của lô
        /// </summary>
        public long BatchId { get; set; }

        /// <summary>
        /// Mã lưu kho
        /// </summary>
        public string InventoryCode { get; set; }

        /// <summary>
        /// Ngày nhập từ NCC ở phiếu nhập từ NCC
        /// </summary>
        public DateTimeOffset? InventoryCodeInboundCreatedTime { get; set; }

        /// <summary>
        /// Phiếu nhập từ NCC
        /// </summary>
        public long? InventoryCodeBillId { get; set; }

        /// <summary>
        /// Số lượng
        /// </summary>
        public decimal Quantity { get; set; }

        /// <summary>
        /// Giá xuất bán
        /// </summary>
        public decimal Price { get; set; }

        /// <summary>
        /// Giá vốn
        /// </summary>
        public decimal CostPrice { get; set; }

        /// <summary>
        /// Chiết khấu
        /// </summary>
        public decimal Discount { get; set; }

        /// <summary>
        /// Thuế VAT
        /// </summary>
        public decimal Tax { get; set; }

        /// <summary>
        /// Trạng thái xuất kho
        /// </summary>
        public Entities.Inventories.Bills.OutboundStatus OutboundStatus { get; set; }

        /// <summary>
        /// Là sản phẩm khuyễn mãi?
        /// </summary>
        public bool IsPromotion { get; set; }

        /// <summary>
        /// Mã tài khoản nợ
        /// </summary>
        public string DebitAccountCode { get; set; }

        /// <summary>
        /// Mã tài khoản thuế
        /// </summary>
        public string TaxAccountCode { get; set; }

        /// <summary>
        /// Mã tài khoản có
        /// </summary>
        public string CreditAccountCode { get; set; }

        public string ProductName { get; set; }
        public string ProductCode { get; set; }

        public string UnitName { get; set; }
        public long? ProductUnitId { get; set; }
        public string ProductUnitName { get; set; }

        /// <summary>
        /// Số lượng đơn vị nhỏ nhất
        /// </summary>
        public decimal ProductUnitQuantity { get; set; }

        /// <summary>
        /// Giá nhập DVNN
        /// </summary>
        public decimal ProductUnitCostPrice => ProductUnitQuantity != 0 ? TotalCostPrice / ProductUnitQuantity : 0;

        public decimal ProductUnitPrice => ProductUnitQuantity != 0 ? TotalNonPrice / ProductUnitQuantity : 0;

        public decimal Amount
        {
            get
            {
                var a = Price * Quantity;
                if (Discount > 0) a *= 1 - Discount / 100m;
                if (Tax > 0) a *= 1 + Tax / 100m;
                a = Math.Round(a, 4);
                return a;
            }
        }

        /// <summary>
        /// Tổng giá bán chưa tính vat, chiết khấu...
        /// </summary>
        public decimal TotalNonPrice => Price * Quantity;

        /// <summary>
        /// Giá sản phẩm khi nhập kho
        /// </summary>
        public decimal TotalCostPrice => CostPrice * Quantity;

        public decimal Revenue => Amount - CostPrice * Quantity;

        public int? BranchId { get; set; }
        public long? DestBranchId { get; set; }
        public int? CustomerId { get; set; }
        public int? CustomerManagerId { get; set; }
        public Entities.Inventories.Customers.CustomerType? CustomerType { get; set; }
        public int? SupplierId { get; set; }

        /// <summary>
        /// Id của bản ghi cha
        /// </summary>
        public long ParentId { get; set; }

        public long ProductParentId { get; set; }
        public int? SupplierParentProductId { get; set; }

        public string BillOrderCode { get; set; }
        public int? BillOrderId { get; set; }
        public BillType? BillType { get; set; }
        public string BillCode { get; set; }
        public bool BillIsDeleted { get; set; }
        public BillStatus? BillStatus { get; set; }
        public SaleType? BillSaleType { get; set; }
        public DateTimeOffset? BillCreatedTime { get; set; }

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

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

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

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

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

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

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