using System.Windows;
using System.Windows.Input;
using PSLauncher.Core.Security;

namespace PSLauncher.App.Views;

/// <summary>
/// Dialog de saisie du password qui déverrouille la section Avancés des Settings.
/// Le password est hashé en SHA-256 et comparé au hash du manifest signé. L'unlock
/// est valable jusqu'à la fermeture du launcher (en-mémoire dans <see cref="ISettingsLockService"/>).
///
/// DialogResult :
///   <c>true</c>  = unlock réussi
///   <c>false</c> = annulation (Cancel)
/// </summary>
public partial class SettingsLockDialog : Window
{
    private readonly ISettingsLockService _lock;

    public SettingsLockDialog(ISettingsLockService lockService)
    {
        InitializeComponent();
        _lock = lockService;
        Loaded += (_, _) =>
        {
            // Trace pour diagnostiquer un éventuel "le dialog ne s'affiche pas".
            // Si on voit cette ligne dans settings-lock.log, le dialog est rendu
            // → le pb est ailleurs (hors écran, derrière owner, etc.).
            try
            {
                var dir = System.IO.Path.Combine(
                    System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData),
                    "PSLauncher", "logs");
                System.IO.Directory.CreateDirectory(dir);
                System.IO.File.AppendAllText(
                    System.IO.Path.Combine(dir, "settings-lock.log"),
                    $"{System.DateTime.UtcNow:yyyy-MM-dd HH:mm:ss.fff}Z  SettingsLockDialog Loaded (visible={IsVisible}, left={Left}, top={Top}){System.Environment.NewLine}");
            }
            catch { }
            Activate();
            PasswordInput.Focus();
        };
    }

    private void OnPasswordKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            TryUnlock();
            e.Handled = true;
        }
    }

    private void OnUnlock(object sender, RoutedEventArgs e) => TryUnlock();

    private void TryUnlock()
    {
        var ok = _lock.TryUnlock(PasswordInput.Password);
        if (ok)
        {
            DialogResult = true;
            Close();
        }
        else
        {
            ErrorText.Visibility = Visibility.Visible;
            PasswordInput.Clear();
            PasswordInput.Focus();
        }
    }

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