using ZB.MOM.WW.LmxProxy.Client.Domain;

namespace ZB.MOM.WW.LmxProxy.Client.IntegrationTests;

public class SubscribeTests : IntegrationTestBase
{
    [Fact]
    public async Task Subscribe_ReceivesUpdates()
    {
        var received = new List<(string Tag, Vtq Vtq)>();
        var receivedEvent = new TaskCompletionSource<bool>();

        var subscription = await Client!.SubscribeAsync(
            new[] { "TestChildObject.TestInt" },
            (tag, vtq) =>
            {
                received.Add((tag, vtq));
                if (received.Count >= 3)
                    receivedEvent.TrySetResult(true);
            },
            ex => receivedEvent.TrySetException(ex));

        // Wait up to 30 seconds for at least 3 updates
        var completed = await Task.WhenAny(receivedEvent.Task, Task.Delay(TimeSpan.FromSeconds(30)));
        subscription.Dispose();

        Assert.True(received.Count >= 1, $"Expected at least 1 update, got {received.Count}");

        var first = received[0];
        Assert.Equal("TestChildObject.TestInt", first.Tag);
        Assert.NotNull(first.Vtq.Value);
        Assert.True(first.Vtq.Timestamp > DateTime.MinValue);
    }
}
