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

namespace Bp.Sync.Domain.Elastics.Inventories.Orders
{
    public class ProductOrderElastic : ElasticBaseEntityWithKey<long>
    {
        /// <summary>
        /// Mã đơn đặt hàng
        /// </summary>
        public long OrderId { get; set; }

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

        /// <summary>
        /// Số lượng đặt hàng
        /// </summary>
        public decimal Quantity { get; set; }

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

        /// <summary>
        /// Số lượng thực tế
        /// </summary>
        public decimal ActualQuantity { get; set; }

        public decimal BaseActualQuantity { get; set; }

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

        /// <summary>
        /// Giá bán dvnn
        /// </summary>
        public decimal BasePrice { get; set; }

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

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

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

        public string UnitName { get; set; }

        public int BaseUnitId { get; set; }
        public string BaseUnitName { 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>
        /// Mô tả / lý do / diễn giải
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        /// Số lượng Max của chi nhánh
        /// </summary>
        public decimal MaxQuantity { get; set; }

        /// <summary>
        /// Số lượng tồn kho tại FC
        /// </summary>
        public decimal FcQuantityInStock { get; set; }

        /// <summary>
        /// Nội dung phản hồi
        /// </summary>
        public string FeedbackContent { get; set; }

        /// <summary>
        /// Số lượng Max của chi nhánh
        /// </summary>
        /// <summary>
        /// ID của bản ghi cha
        /// </summary>
        public long ParentId { get; set; }

        /// <summary>
        /// ID của khuyến mãi
        /// </summary>
        public int PromotionId { get; set; }

        /// <summary>
        /// Trạng thái
        /// </summary>
        public Entities.Inventories.Orders.ProductOrderStatus ProductOrderStatus { get; set; }

        //them vao cho bao cao
        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;
            }
        }

        //thêm giá
        public decimal? CostPrice { get; set; }

        public decimal? BaseCostPrice { get; set; }

        public decimal? TotalCostPrice
        {
            get
            {
                if (CostPrice.HasValue) return CostPrice.Value * Quantity;
                else return null;
            }
        }

        public decimal? Revenue
        {
            get
            {
                if (TotalCostPrice.HasValue)
                    return Amount - TotalCostPrice.Value;
                else return (decimal?)null;
            }
        }

        public decimal? RevenueRate
        {
            get
            {
                if (TotalCostPrice.HasValue && Revenue.HasValue && TotalCostPrice.Value != 0) return Revenue.Value * 100 / TotalCostPrice.Value;
                else if (TotalCostPrice.HasValue && TotalCostPrice.Value == 0) return 0;
                else return null;
            }
        }

        public bool? OrderIsDeleted { get; set; }
        public string OrderCode { get; set; }
        public Entities.Inventories.Orders.OrderType? OrderType { get; set; }
        public Entities.Inventories.Orders.OrderStatus? OrderStatus { get; set; }
        public int? OrderCustomerId { get; set; }
        public int? OrderBranchId { get; set; }
        public int? OrderDestBranchId { get; set; }
        public int? OrderCreatedBy { get; set; }
        public string OrderCreatedByUserName { get; set; }
        public DateTimeOffset? OrderCreatedTime { get; set; }

        /// <summary>
        /// Trạng thái thanh toán ở phiếu
        /// </summary>
        public Entities.Inventories.CollectMoneyStatus BillCollectMoneyStatus { get; set; }

        public DateTimeOffset? BillCompletedTime { get; set; }

        /// <summary>
        /// Ngày đặt hàng
        /// </summary>
        public DateTimeOffset? OrderDate { get; set; }

        /// <summary>
        /// Ngày duyệt đơn hàng
        /// </summary>
        public DateTimeOffset? OrderApprovedDate { get; set; }

        public DateTimeOffset? OrderSlaTime { get; set; }

        /// <summary>
        /// ID của lý do
        /// </summary>
        public int ReasonId { get; set; }

        public string ReasonName { get; set; }
        public Entities.Inventories.Reasons.ReasonType ReasonType { get; set; }
        public bool ReasonIsReject { get; set; }

        /// <summary>
        /// Thêm NCC sản phẩm cho báo cáo mua hàng
        /// </summary>
        public int ProductSupplierId { get; set; }

        public Entities.Inventories.Suppliers.SupplierType ProductSupplierType { get; set; }
        public string ProductName { get; set; }
        public string ProductCode { get; set; }
        public bool AvailableInItock { get; set; } = false;
        public DateTimeOffset? InboundDate { get; set; }

        public int? InboundDplus
        {
            get
            {
                if (OrderDate.HasValue && InboundDate.HasValue)
                {
                    var day = (InboundDate.Value - OrderDate.Value).TotalDays;
                    if (OrderDate.Value.Hour > 8) day--;
                    if (day < 0) day = 0;
                    return (int)Math.Floor(day);
                }
                return null;
            }
        }
    }
}