using System.Windows;
using System.Windows.Media;
using PSLauncher.Core.Licensing;

namespace PSLauncher.App.Views;

public partial class OnboardingDialog : Window
{
    private readonly ILicenseService _licenseService;

    public bool LicenseActivated { get; private set; }

    public OnboardingDialog(ILicenseService licenseService, string? prefilledKey = null)
    {
        _licenseService = licenseService;
        InitializeComponent();
        if (!string.IsNullOrEmpty(prefilledKey)) KeyBox.Text = prefilledKey;
        KeyBox.SelectAll();
        KeyBox.Focus();
    }

    private async void OnActivate(object sender, RoutedEventArgs e)
    {
        var key = KeyBox.Text?.Trim().ToUpperInvariant() ?? string.Empty;
        if (string.IsNullOrEmpty(key) || key.Contains("XXXX"))
        {
            ShowStatus("Saisis une clé valide au format PRSRV-XXXX-XXXX-XXXX-XXXX.", isError: true);
            return;
        }

        ActivateButton.IsEnabled = false;
        ShowStatus("Validation en cours…", isError: false);

        try
        {
            var resp = await _licenseService.ValidateAsync(key, CancellationToken.None);
            switch (resp.Status)
            {
                case "valid":
                    _licenseService.SaveCached(key, resp);
                    ShowStatus($"License activée ({resp.OwnerName}). Téléchargements autorisés jusqu'au {resp.DownloadEntitlementUntil:dd/MM/yyyy}.", isError: false);
                    LicenseActivated = true;
                    DialogResult = true;
                    Close();
                    return;

                case "expired":
                    _licenseService.SaveCached(key, resp); // on cache quand même pour permettre de lancer les versions installées
                    ShowStatus($"License expirée le {resp.DownloadEntitlementUntil:dd/MM/yyyy}. Tu peux toujours utiliser les versions déjà installées, mais plus en télécharger de nouvelles.", isError: true);
                    LicenseActivated = true;
                    DialogResult = true;
                    Close();
                    return;

                case "revoked":
                    ShowStatus("Cette license a été révoquée. Contacte ASTERION.", isError: true);
                    break;
                case "machine_limit_exceeded":
                    ShowStatus(resp.Message ?? "Cette license a atteint son nombre maximum de machines.", isError: true);
                    break;
                case "invalid":
                default:
                    ShowStatus(resp.Message ?? "Clé de license inconnue.", isError: true);
                    break;
            }
        }
        catch (Exception ex)
        {
            ShowStatus($"Erreur de communication avec le serveur :\n{ex.Message}", isError: true);
        }
        finally
        {
            ActivateButton.IsEnabled = true;
        }
    }

    private void OnLater(object sender, RoutedEventArgs e)
    {
        LicenseActivated = false;
        DialogResult = false;
        Close();
    }

    private void ShowStatus(string text, bool isError)
    {
        StatusText.Text = text;
        StatusText.Foreground = isError
            ? new SolidColorBrush(Color.FromRgb(0xF8, 0x71, 0x71))
            : (System.Windows.Media.Brush)Application.Current.FindResource("Brush.Text.Secondary");
    }
}
