using System;
using System.ComponentModel.DataAnnotations;
using TakeoutSaaS.Shared.Abstractions.Entities;
using TakeoutSaaS.Domain.Inventory.Enums;

namespace TakeoutSaaS.Domain.Inventory.Entities;

/// <summary>
/// SKU 在门店的库存信息。
/// </summary>
public sealed class InventoryItem : MultiTenantEntityBase
{
    /// <summary>
    /// 门店标识。
    /// </summary>
    public long StoreId { get; set; }

    /// <summary>
    /// SKU 标识。
    /// </summary>
    public long ProductSkuId { get; set; }

    /// <summary>
    /// 批次编号，可为空表示混批。
    /// </summary>
    public string? BatchNumber { get; set; }

    /// <summary>
    /// 可用库存。
    /// </summary>
    public int QuantityOnHand { get; set; }

    /// <summary>
    /// 已锁定库存（订单占用）。
    /// </summary>
    public int QuantityReserved { get; set; }

    /// <summary>
    /// 安全库存阈值。
    /// </summary>
    public int? SafetyStock { get; set; }

    /// <summary>
    /// 储位或仓位信息。
    /// </summary>
    public string? Location { get; set; }

    /// <summary>
    /// 过期日期。
    /// </summary>
    public DateTime? ExpireDate { get; set; }

    /// <summary>
    /// 是否预售商品。
    /// </summary>
    public bool IsPresale { get; set; }

    /// <summary>
    /// 预售开始时间（UTC）。
    /// </summary>
    public DateTime? PresaleStartTime { get; set; }

    /// <summary>
    /// 预售结束时间（UTC）。
    /// </summary>
    public DateTime? PresaleEndTime { get; set; }

    /// <summary>
    /// 预售名额（上限）。
    /// </summary>
    public int? PresaleCapacity { get; set; }

    /// <summary>
    /// 当前预售已锁定数量。
    /// </summary>
    public int PresaleLocked { get; set; }

    /// <summary>
    /// 单品限购（覆盖商品级 MaxQuantityPerOrder）。
    /// </summary>
    public int? MaxQuantityPerOrder { get; set; }

    /// <summary>
    /// 是否标记售罄。
    /// </summary>
    public bool IsSoldOut { get; set; }

    /// <summary>
    /// 批次扣减策略。
    /// </summary>
    public InventoryBatchConsumeStrategy BatchConsumeStrategy { get; set; } = InventoryBatchConsumeStrategy.Fifo;

    /// <summary>
    /// 并发控制字段。
    /// </summary>
    [Timestamp]
    public byte[] RowVersion { get; set; } = Array.Empty<byte>();
}
