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

namespace foodmarket.Domain.Inventory;

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

/// <summary>Документ перемещения товара между складами одной организации.
/// При проведении создаёт ПАРУ движений: TransferOut из FromStore и
/// TransferIn в ToStore (атомарной транзакцией). Unpost тоже атомарен —
/// возвращает обратно ОБА движения. Никогда не должно остаться orphan-движений
/// (только один из двух).</summary>
public class Transfer : TenantEntity, IVersionedEntity
{
    public uint Xmin { get; set; }

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

    public Guid FromStoreId { get; set; }
    public Store FromStore { get; set; } = null!;

    public Guid ToStoreId { get; set; }
    public Store ToStore { get; set; } = null!;

    public string? Notes { get; set; }

    /// <summary>Балансовая сумма перемещения = Σ Quantity·UnitCost (только для отчётов;
    /// при проведении не влияет на Product.Cost).</summary>
    public decimal Total { get; set; }

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

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

public class TransferLine : TenantEntity
{
    public Guid TransferId { get; set; }
    public Transfer Transfer { get; set; } = null!;

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

    public decimal Quantity { get; set; }
    /// <summary>Балансовая цена единицы (снимок Product.Cost). На остатках не отражается.</summary>
    public decimal UnitCost { get; set; }
    public decimal LineTotal { get; set; }

    public int SortOrder { get; set; }
}
