using NATS.Server.Auth;
using NATS.Server.Subscriptions;

namespace NATS.Server.Tests;

public class AccountTests
{
    [Fact]
    public void Account_has_name_and_own_sublist()
    {
        var account = new Account("test-account");

        account.Name.ShouldBe("test-account");
        account.SubList.ShouldNotBeNull();
        account.SubList.Count.ShouldBe(0u);
    }

    [Fact]
    public void Account_tracks_clients()
    {
        var account = new Account("test");

        account.ClientCount.ShouldBe(0);
        account.AddClient(1);
        account.ClientCount.ShouldBe(1);
        account.RemoveClient(1);
        account.ClientCount.ShouldBe(0);
    }

    [Fact]
    public void GlobalAccount_has_default_name()
    {
        Account.GlobalAccountName.ShouldBe("$G");
    }

    [Fact]
    public void Account_enforces_max_connections()
    {
        var acc = new Account("test") { MaxConnections = 2 };
        acc.AddClient(1).ShouldBeTrue();
        acc.AddClient(2).ShouldBeTrue();
        acc.AddClient(3).ShouldBeFalse(); // exceeds limit
        acc.ClientCount.ShouldBe(2);
    }

    [Fact]
    public void Account_unlimited_connections_when_zero()
    {
        var acc = new Account("test") { MaxConnections = 0 };
        acc.AddClient(1).ShouldBeTrue();
        acc.AddClient(2).ShouldBeTrue();
    }

    [Fact]
    public void Account_enforces_max_subscriptions()
    {
        var acc = new Account("test") { MaxSubscriptions = 2 };
        acc.IncrementSubscriptions().ShouldBeTrue();
        acc.IncrementSubscriptions().ShouldBeTrue();
        acc.IncrementSubscriptions().ShouldBeFalse();
    }

    [Fact]
    public void Account_decrement_subscriptions()
    {
        var acc = new Account("test") { MaxSubscriptions = 1 };
        acc.IncrementSubscriptions().ShouldBeTrue();
        acc.DecrementSubscriptions();
        acc.IncrementSubscriptions().ShouldBeTrue(); // slot freed
    }
}
