using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
using Deploymentcenter.Client;
using Predictalytics.Hosting;

namespace Predictalytics.Shell.Views;

/// <summary>
/// Aktivierungsfenster, wenn keine nutzbare Lizenz vorliegt.
/// <see cref="Completion"/> liefert die Sitzung, sobald das Deployment Center die
/// Aktivierung fuer diese Maschine bestaetigt hat; null, wenn der Benutzer abbricht.
/// </summary>
public partial class LicenseWindow : Window
{
    private readonly LicenseClient _client = null!;
    private readonly TaskCompletionSource<LicenseSession?> _completion = new();

    /// <summary>Wird abgeschlossen, wenn aktiviert oder abgebrochen wurde.</summary>
    public Task<LicenseSession?> Completion => _completion.Task;

    public LicenseWindow()
    {
        InitializeComponent();

        // Die Aktivierung wird am Server an diese Hardware-ID gebunden — ohne sie kann
        // der Support nicht sagen, welcher Platz beim Maschinenwechsel freizugeben ist.
        try
        {
            var hw = LicenseGuard.GetHardwareInfo();
            HardwareIdText.Text = $"{hw.HardwareId}\nQuelle: {hw.HwidSource}";
        }
        catch (Exception ex)
        {
            HardwareIdText.Text = $"nicht ermittelbar: {ex.Message}";
        }
    }

    public LicenseWindow(LicenseClient client, LicenseValidationResult? lastResult) : this()
    {
        _client = client;

        if (lastResult is null) return;

        // IsTransient heisst: der Server hat gar kein Urteil gefaellt. Dem Benutzer zu
        // sagen, seine Lizenz sei schlecht, waere falsch — die Verbindung ist es.
        SetStatus(lastResult.IsTransient
            ? "Das Deployment Center ist derzeit nicht erreichbar und es liegt keine gültige " +
              $"Offline-Prüfung mehr vor. Bitte Verbindung prüfen und erneut versuchen.\n{lastResult.Message}"
            : $"Letzte Prüfung: {lastResult.Status} — {lastResult.Message}",
            isError: true);
    }

    private async void OnActivateClick(object? sender, RoutedEventArgs e)
    {
        var key = KeyBox.Text ?? "";
        if (string.IsNullOrWhiteSpace(key))
        {
            SetStatus("Bitte einen Lizenzschlüssel eingeben.", isError: true);
            return;
        }

        ActivateButton.IsEnabled = false;
        Busy.IsVisible = true;
        SetStatus("Prüfe Lizenz am Deployment Center…", isError: false);

        try
        {
            var (session, result) = await LicenseGuard.ActivateAsync(_client, key);
            if (session is not null)
            {
                _completion.TrySetResult(session);
                Close();
                return;
            }

            SetStatus($"Lizenz nicht nutzbar ({result.Status}):\n{result.Message}", isError: true);
        }
        catch (Exception ex)
        {
            SetStatus($"Fehler bei der Prüfung: {ex.Message}", isError: true);
        }
        finally
        {
            ActivateButton.IsEnabled = true;
            Busy.IsVisible = false;
        }
    }

    private void OnExitClick(object? sender, RoutedEventArgs e)
    {
        _completion.TrySetResult(null);
        Close();
    }

    protected override void OnClosed(EventArgs e)
    {
        // Schliessen ueber das Fensterkreuz zaehlt als Abbruch.
        _completion.TrySetResult(null);
        base.OnClosed(e);
    }

    private void SetStatus(string message, bool isError)
    {
        StatusText.Text = message;
        StatusText.IsVisible = true;
        StatusText.Foreground = isError
            ? new SolidColorBrush(Color.FromRgb(205, 92, 92))
            : new SolidColorBrush(Color.FromRgb(150, 150, 150));
    }
}
