using ZB.MOM.WW.ScadaBridge.CentralUI.Components.Shared;

namespace ZB.MOM.WW.ScadaBridge.CentralUI.Tests.Shared;

/// <summary>
/// Unit tests for the <see cref="PagerWindow"/> helper introduced for
/// CentralUI-016 — windowed pagination that keeps the rendered button count
/// bounded regardless of total page count.
/// </summary>
public class PagerWindowTests
{
    [Fact]
    public void Build_SmallPageCount_ReturnsEveryPage_NoEllipsis()
    {
        var pages = PagerWindow.Build(currentPage: 3, totalPages: 5);

        Assert.Equal(new[] { 1, 2, 3, 4, 5 }, pages);
    }

    [Fact]
    public void Build_LargePageCount_IsBounded_AndIncludesFirstAndLast()
    {
        var pages = PagerWindow.Build(currentPage: 100, totalPages: 200);

        Assert.Contains(1, pages);
        Assert.Contains(200, pages);
        Assert.Contains(100, pages);
        // First, ellipsis, window of 5, ellipsis, last — never the full 200.
        Assert.True(pages.Count <= 12, $"Expected a bounded window but got {pages.Count} entries.");
    }

    [Fact]
    public void Build_LargePageCount_InsertsEllipsisForGaps()
    {
        // 0 is the ellipsis sentinel.
        var pages = PagerWindow.Build(currentPage: 100, totalPages: 200);

        Assert.Contains(0, pages);
    }

    [Fact]
    public void Build_CurrentNearStart_NoLeadingEllipsis()
    {
        var pages = PagerWindow.Build(currentPage: 1, totalPages: 200);

        // Pages 1..3 are contiguous from the start, so no ellipsis before them.
        Assert.Equal(1, pages[0]);
        Assert.NotEqual(0, pages[1]);
    }

    [Fact]
    public void Build_ClampsOutOfRangeCurrentPage()
    {
        var pages = PagerWindow.Build(currentPage: 999, totalPages: 200);

        Assert.Contains(200, pages);
        Assert.True(pages.Count <= 12);
    }

    [Theory]
    [InlineData(0)]
    [InlineData(-3)]
    public void Build_NonPositiveTotalPages_ReturnsEmpty(int totalPages)
    {
        Assert.Empty(PagerWindow.Build(currentPage: 1, totalPages: totalPages));
    }
}
