using System;
using Microsoft.Data.Sqlite;
using Xunit;
using ytLive.ViewModels;

namespace ytLive.Tests;

/// <summary>
/// The About overlay is the in-app creator hub: it opens from the real window,
/// and its licensing sub-panel surfaces the full THIRD-PARTY-NOTICES.txt
/// in-app (scrolling text, never the OS viewer / Notepad). Drives the real VM
/// through the real window — same real-App + temp-DB pattern as the round-clip
/// and source-naming tests.
/// </summary>
[Collection("RealApp")]
public sealed class AboutHubTests
{
    private readonly RealAppHost _app;

    public AboutHubTests(RealAppHost app)
    {
        _app = app;
    }

    [Fact]
    public void About_Opens_InApp_Licensing_Loads_Shipped_Notices()
    {
        _app.Run(Run);
    }

    private void Run()
    {
        var tempDb = System.IO.Path.Combine(System.IO.Path.GetTempPath(), $"ytLlive-about-{Guid.NewGuid():N}.db");
        MainViewModel.LayoutPathOverride = tempDb;
        var window = new MainWindow();
        var vm = (MainViewModel)window.DataContext;
        try
        {
            // About hub opens (the wordmark / gear menu entry point).
            vm.OpenAboutCommand.Execute(null);
            Assert.True(vm.IsAboutOpen);
            Assert.False(vm.IsLicensesOpen);

            // The hub links resolve to real destinations (channel + mastodon +
            // coffee are live; premium is the tabled billing seam).
            Assert.Equal("https://youtube.com/@llamachileshop", MainViewModel.ChannelUrl);
            Assert.Equal("https://mastodon.llamachile.tube/@gramps", MainViewModel.MastodonUrl);
            Assert.Equal("https://buymeacoffee.com/llamachiley", MainViewModel.CoffeeUrl);

            // The licensing panel loads the full shipped notices text in-app.
            vm.OpenLicensesCommand.Execute(null);
            Assert.True(vm.IsLicensesOpen);
            Assert.False(string.IsNullOrWhiteSpace(vm.LicensesText));
            Assert.Contains("Third-Party Notices", vm.LicensesText, StringComparison.OrdinalIgnoreCase);
            Assert.Contains("LGPL", vm.LicensesText, StringComparison.OrdinalIgnoreCase);

            // Back returns to the hub view (code-behind click handler path is
            // equivalent; here we assert the VM contract the handler uses).
            vm.IsLicensesOpen = false;
            Assert.True(vm.IsAboutOpen);
        }
        finally
        {
            window.Close();
            MainViewModel.LayoutPathOverride = null;
            SqliteConnection.ClearAllPools();
            try { System.IO.File.Delete(tempDb); } catch { /* best-effort cleanup */ }
        }
    }
}
