namespace GmRelay.Shared.Domain;

public static class SessionCapacityRules
{
    public static string DecideJoinStatus(int? maxPlayers, int activeParticipants)
    {
        if (!maxPlayers.HasValue)
        {
            return ParticipantRegistrationStatus.Active;
        }

        return activeParticipants < maxPlayers.Value
            ? ParticipantRegistrationStatus.Active
            : ParticipantRegistrationStatus.Waitlisted;
    }

    public static bool CanPromoteWaitlistedPlayer(int? maxPlayers, int activeParticipants, int waitlistedParticipants)
    {
        if (waitlistedParticipants <= 0)
        {
            return false;
        }

        return !maxPlayers.HasValue || activeParticipants < maxPlayers.Value;
    }

    public static bool ShouldPromoteAfterParticipantLeaves(
        string removedRegistrationStatus,
        int? maxPlayers,
        int activeParticipantsAfterLeave,
        int waitlistedParticipants)
    {
        return removedRegistrationStatus == ParticipantRegistrationStatus.Active
            && CanPromoteWaitlistedPlayer(maxPlayers, activeParticipantsAfterLeave, waitlistedParticipants);
    }
}
