using foodmarket.Domain.Catalog;
using foodmarket.Domain.Common;

namespace foodmarket.Domain.Inventory;

public enum InventoryStatus
{
    Draft = 0,
    Posted = 1,
}

/// <summary>Документ инвентаризации (пересчёта). При создании контроллер
/// заполняет <c>bookQty</c> по текущему <see cref="Stock"/> склада. После
/// внесения фактических количеств (<c>actualQty</c>) при Post создаются
/// корректирующие движения <see cref="MovementType.InventoryAdjustment"/>
/// на <c>diff = actual - book</c>: положительные приходят (излишек),
/// отрицательные списываются (недостача).
///
/// Назван <c>InventoryDoc</c> чтобы не конфликтовать с .NET-неймспейсом
/// <c>System.Collections.Specialized.Inventory</c> и не путаться с самой
/// сущностью «остатков». Таблица — <c>inventories</c>.</summary>
public class InventoryDoc : TenantEntity, IVersionedEntity
{
    public uint Xmin { get; set; }

    public string Number { get; set; } = "";
    public DateTime Date { get; set; } = DateTime.UtcNow;
    public InventoryStatus Status { get; set; } = InventoryStatus.Draft;

    public Guid StoreId { get; set; }
    public Store Store { get; set; } = null!;

    public string? Notes { get; set; }

    public DateTime? PostedAt { get; set; }
    public Guid? PostedByUserId { get; set; }

    public ICollection<InventoryLine> Lines { get; set; } = new List<InventoryLine>();
}

public class InventoryLine : TenantEntity
{
    public Guid InventoryDocId { get; set; }
    public InventoryDoc InventoryDoc { get; set; } = null!;

    public Guid ProductId { get; set; }
    public Product Product { get; set; } = null!;

    /// <summary>Учётное количество (Stock.Quantity на момент создания/обновления документа).</summary>
    public decimal BookQty { get; set; }

    /// <summary>Фактическое количество (введено вручную или импортом CSV).</summary>
    public decimal ActualQty { get; set; }

    /// <summary>diff = ActualQty - BookQty (положительный — излишек, отрицательный — недостача).
    /// Вычисляется и сохраняется при сохранении строки для отчётности.</summary>
    public decimal Diff { get; set; }

    /// <summary>Снимок Product.Cost для расчёта суммы излишка/недостачи (только для отчётов).</summary>
    public decimal UnitCost { get; set; }

    public int SortOrder { get; set; }
}
