using GmRelay.Bot.Features.Confirmation.HandleRsvp;
using GmRelay.Shared.Domain;

namespace GmRelay.Bot.Tests.Features.Confirmation.HandleRsvp;

public sealed class RsvpFlowRulesTests
{
    [Fact]
    public void Evaluate_ShouldRevertAndAlert_WhenConfirmedSessionGetsDecline()
    {
        var decision = RsvpFlowRules.Evaluate(
            RsvpStatus.Declined,
            SessionStatus.Confirmed,
            totalParticipants: 3,
            confirmedParticipants: 2);

        Assert.True(decision.ShouldAlertGm);
        Assert.True(decision.ShouldRevertSessionToConfirmationSent);
        Assert.False(decision.ShouldMarkSessionConfirmed);
        Assert.Equal("Вы отказались от участия.", decision.CallbackText);
    }

    [Fact]
    public void Evaluate_ShouldMarkConfirmed_WhenLastParticipantConfirms()
    {
        var decision = RsvpFlowRules.Evaluate(
            RsvpStatus.Confirmed,
            SessionStatus.ConfirmationSent,
            totalParticipants: 3,
            confirmedParticipants: 3);

        Assert.True(decision.ShouldMarkSessionConfirmed);
        Assert.True(decision.ShouldNotifyGroup);
        Assert.True(decision.ShouldNotifyGm);
    }

    [Fact]
    public void Evaluate_ShouldKeepWaiting_WhenNotEveryoneConfirmed()
    {
        var decision = RsvpFlowRules.Evaluate(
            RsvpStatus.Confirmed,
            SessionStatus.ConfirmationSent,
            totalParticipants: 4,
            confirmedParticipants: 2);

        Assert.False(decision.ShouldMarkSessionConfirmed);
        Assert.False(decision.ShouldNotifyGroup);
        Assert.False(decision.ShouldNotifyGm);
    }
}
