using Bp.Sync.Domain.Elastics.BaseEntities;
using Bp.Sync.Domain.Entities.FcBusinesses.Bills;
using System.ComponentModel.DataAnnotations;

namespace Bp.Sync.Domain.Elastics.FcBusinesses
{
    public class RetailStatisticElastic : ElasticBaseEntityWithKey<long>
    {
        public long UUID { get; set; }
        public long ProductRetailId { get; set; }
        public long ProductId { get; set; }
        public long BillId { get; set; }
        /// <summary>
        /// Đơn vị cơ bản
        /// </summary>
        public int BaseUnitId { get; set; }
        /// <summary>
        /// Số lượng bán
        /// </summary>
        public decimal RetailQuantity { get; set; }
        /// <summary>
        /// Đơn vị bán
        /// </summary>
        public int RetailUnitId { get; set; }
        /// <summary>
        /// Giá bán
        /// </summary>
        public decimal RetailPrice { get; set; }
        /// Giá bán theo đơn vị cơ bản (nhỏ nhất)
        /// </summary>
        public decimal RetailBaseUnitPrice { get; set; }
        public decimal RetailBaseUnitCost { get; set; }

        /// <summary>
        /// Tổng tiền bán
        /// </summary>
        public decimal RetailTotalPrice { get; set; }
        /// <summary>
        /// Chiếu khấu
        /// </summary>
        public decimal RetailDiscount { get; set; }
        /// <summary>
        /// Thuế (%)
        /// </summary>
        public float RetailTax { get; set; }
        /// <summary>
        /// Lô / Hạn sử dụng
        /// </summary>
        public long ProductShipmentId { get; set; }
        /// <summary>
        /// Vị trí
        /// </summary>
        public long PositionId { get; set; }
        /// <summary>
        /// Mã lưu kho
        /// </summary>
        [MaxLength(256)]
        public string InventoryCode { get; set; }
        /// <summary>
        /// Số lượng trước khi sửa của RetailBaseUnitQuantity
        /// </summary>
        public decimal RetailOriginalQuantity { get; set; }
        /// <summary>
        /// Số lượng bán hàng đã chuyển đổi về đơn vị cơ bản (nhỏ nhất)
        /// </summary>
        public decimal RetailBaseUnitQuantity { get; set; }
        /// <summary>
        /// Id sản phẩm trong kho
        /// </summary>
        public long ProductStorageId { get; set; }
        /// <summary>
        /// Chi nhánh
        /// </summary>
        public long BranchId { get; set; }
        /// <summary>
        /// Id khách hàng
        /// </summary>
        public int? CustomerId { get; set; }
        public Entities.FcBusinesses.StatisticStatus? StatisticStatus { get; set; }

        public string CustomerName { get; set; }
        public string CustomerUserName { get; set; }
        public string CustomerPhoneNumber { get; set; }

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

        public string BaseUnitName { get; set; }
        public string RetailUnitName { get; set; }

        public string BillCode { get; set; }
        public BillType? BillType { get; set; }
        public PaymentMode? BillPaymentMode { get; set; }

        /// <summary>
        /// Lợi nhuận
        /// </summary>
        public decimal? Revenue
        {
            get
            {
                if (BillType.HasValue && BillType.Value == Entities.FcBusinesses.Bills.BillType.CustomerReturnBill)
                    return (RetailTotalPrice * (-1) - RetailBaseUnitCost * RetailBaseUnitQuantity) * (-1);
                else
                    return RetailTotalPrice - RetailBaseUnitCost * RetailBaseUnitQuantity;
            }
        }

        /// <summary>
        /// Giá sản phẩm khi nhập kho
        /// </summary>
        public decimal? TotalInboundCostPrice => RetailBaseUnitCost * RetailBaseUnitQuantity;

        /// <summary>
        /// Giá nhập trung bình theo đơn vị cơ bản (nhỏ nhất)
        /// </summary>
        public decimal RetailBaseUnitCostPrice { get; set; }
        /// <summary>
        /// Lợi nhuận
        /// </summary>
        public decimal? BaseRevenue
        {
            get
            {
                if (BillType.HasValue && BillType.Value == Entities.FcBusinesses.Bills.BillType.CustomerReturnBill)
                    return (RetailTotalPrice * (-1) - RetailBaseUnitCostPrice * RetailBaseUnitQuantity) * (-1);
                else
                    return RetailTotalPrice - RetailBaseUnitCostPrice * RetailBaseUnitQuantity;
            }
        }
        public decimal? BaseRevenueRate
        {
            get
            {
                if (TotalBaseInboundCostPrice > 0 && BaseRevenue.HasValue) return BaseRevenue.Value * 100 / TotalBaseInboundCostPrice;
                else if (TotalBaseInboundCostPrice == 0) return 0;
                if (TotalBaseInboundCostPrice < 0 && BaseRevenue.HasValue) return BaseRevenue.Value * 100 / TotalBaseInboundCostPrice * (-1);
                else return null;
            }
        }

        /// <summary>
        /// Giá sản phẩm khi nhập kho
        /// </summary>
        public decimal TotalBaseInboundCostPrice => BillType.HasValue && BillType.Value == Entities.FcBusinesses.Bills.BillType.CustomerReturnBill ? RetailBaseUnitCostPrice * RetailBaseUnitQuantity * (-1) : RetailBaseUnitCostPrice * RetailBaseUnitQuantity;

    }
}
