using FluentAssertions;
using foodmarket.Application.Sales;
using Xunit;

namespace foodmarket.UnitTests;

/// <summary>Достаточность оплаты розничного чека (логика RetailSalesController.Post).</summary>
public class RetailPaymentValidatorTests
{
    [Theory]
    [InlineData(1000, 0, 1000)]      // ровно наличными
    [InlineData(0, 1000, 1000)]      // ровно картой
    [InlineData(600, 400, 1000)]     // смешанная оплата, ровно
    [InlineData(1500, 0, 1000)]      // переплата наличными (сдача) — ок
    [InlineData(700, 700, 1000)]     // переплата смешанная — ок
    public void Sufficient_payment_passes(decimal cash, decimal card, decimal total)
        => RetailPaymentValidator.IsSufficient(cash, card, total).Should().BeTrue();

    [Theory]
    [InlineData(999, 0, 1000)]       // недоплата наличными
    [InlineData(0, 0, 1000)]         // не оплачено вовсе
    [InlineData(400, 400, 1000)]     // смешанная недоплата
    public void Insufficient_payment_fails(decimal cash, decimal card, decimal total)
        => RetailPaymentValidator.IsSufficient(cash, card, total).Should().BeFalse();

    [Fact]
    public void Rounds_to_two_decimals_before_comparing()
    {
        // 999.999 округляется до 1000.00 ≥ 1000 → ок (защита от float-дрейфа)
        RetailPaymentValidator.IsSufficient(999.999m, 0m, 1000m).Should().BeTrue();
        // 999.994 → 999.99 < 1000 → недоплата
        RetailPaymentValidator.IsSufficient(999.994m, 0m, 1000m).Should().BeFalse();
    }
}
