using CMSMicroservice.Domain.Common;
using CMSMicroservice.Domain.Enums;
using CMSMicroservice.Domain.Entities.DiscountShop;

namespace CMSMicroservice.Domain.Entities;

/// <summary>
/// موجودی کالا در انبار
/// </summary>
public class InventoryItem : BaseAuditableEntity
{
    // ========== شناسه محصول (یکی از دو فیلد زیر پر است) ==========
    
    /// <summary>
    /// شناسه محصول فروشگاه معمولی
    /// </summary>
    public long? ProductId { get; set; }
    
    /// <summary>
    /// محصول فروشگاه معمولی
    /// </summary>
    public Product? Product { get; set; }
    
    /// <summary>
    /// شناسه محصول فروشگاه تخفیفی
    /// </summary>
    public long? DiscountProductId { get; set; }
    
    /// <summary>
    /// محصول فروشگاه تخفیفی
    /// </summary>
    public DiscountProduct? DiscountProduct { get; set; }
    
    // ========== نوع محصول ==========
    
    /// <summary>
    /// نوع محصول (معمولی یا تخفیفی)
    /// </summary>
    public ProductType ProductType { get; set; }
    
    // ========== موجودی ==========
    
    /// <summary>
    /// موجودی فعلی (منبع اصلی)
    /// </summary>
    public int Quantity { get; set; }
    
    /// <summary>
    /// مقدار رزرو شده برای سفارشات pending
    /// </summary>
    public int ReservedQuantity { get; set; }
    
    /// <summary>
    /// موجودی قابل فروش (محاسباتی)
    /// </summary>
    public int AvailableQuantity => Quantity - ReservedQuantity;
    
    // ========== تنظیمات انبار ==========
    
    /// <summary>
    /// آستانه هشدار کم‌موجودی
    /// </summary>
    public int LowStockThreshold { get; set; } = 10;
    
    /// <summary>
    /// نقطه سفارش مجدد
    /// </summary>
    public int ReorderPoint { get; set; } = 5;
    
    /// <summary>
    /// حداکثر موجودی مجاز
    /// </summary>
    public int MaxStockLevel { get; set; } = 1000;
    
    // ========== آمار ==========
    
    /// <summary>
    /// تاریخ آخرین ورود کالا
    /// </summary>
    public DateTime? LastRestockedAt { get; set; }
    
    /// <summary>
    /// تاریخ آخرین فروش
    /// </summary>
    public DateTime? LastSoldAt { get; set; }
    
    // ========== انبار (برای آینده) ==========
    
    /// <summary>
    /// شناسه انبار (پیش‌فرض: انبار اصلی)
    /// </summary>
    public long WarehouseId { get; set; } = 1;
    
    /// <summary>
    /// انبار
    /// </summary>
    public Warehouse? Warehouse { get; set; }
    
    // ========== Navigation Properties ==========
    
    /// <summary>
    /// حرکات انبار مرتبط با این آیتم
    /// </summary>
    public ICollection<StockMovement> StockMovements { get; set; } = new List<StockMovement>();
}