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

namespace foodmarket.Domain.Sales;

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

/// <summary>Оптовая отгрузка контрагенту-юрлицу. По MoySklad — «Отгрузка».
/// Отличие от <see cref="RetailSale"/>: всегда юрлицо (CounterpartyId
/// обязателен), способ оплаты — нал/безнал/в кредит, цена и НДС могут
/// отличаться от розничных (тип цен «Опт.»). При проведении создаёт
/// <see cref="Inventory.StockMovement"/> тип
/// <see cref="Inventory.MovementType.WholesaleSale"/> с -Quantity.</summary>
public class Demand : TenantEntity, IVersionedEntity
{
    public uint Xmin { get; set; }

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

    public Guid CustomerId { get; set; }
    public Counterparty Customer { get; set; } = null!;

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

    public Guid CurrencyId { get; set; }
    public Currency Currency { get; set; } = null!;

    /// <summary>0=Cash, 1=Card, 2=BankTransfer, 3=Credit (постоплата), 99=Mixed.
    /// Совпадает с <see cref="PaymentMethod"/> + добавлен Credit.</summary>
    public DemandPayment Payment { get; set; } = DemandPayment.BankTransfer;

    public decimal Subtotal { get; set; }
    public decimal DiscountTotal { get; set; }
    public decimal Total { get; set; }

    /// <summary>Сумма оплаченного по этой отгрузке (для отслеживания дебиторки).
    /// Может быть меньше Total — тогда остаток за контрагентом (Total − PaidAmount).
    /// На MVP не строим отчёт по задолженности — просто сохраняем.</summary>
    public decimal PaidAmount { get; set; }

    public string? Notes { get; set; }

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

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

public enum DemandPayment
{
    Cash = 0,
    Card = 1,
    BankTransfer = 2,
    Credit = 3,        // постоплата, дебиторка
    Mixed = 99,
}

public class DemandLine : TenantEntity
{
    public Guid DemandId { get; set; }
    public Demand Demand { get; set; } = null!;

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

    public decimal Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal Discount { get; set; }
    public decimal LineTotal { get; set; }
    public decimal VatPercent { get; set; }
    public int SortOrder { get; set; }
}
