using Godot;
using Mr.BrickAdventures.Autoloads;

namespace Mr.BrickAdventures.scripts.UI;

public partial class PauseMenu : Control
{
    [Export] public Control PauseMenuControl { get; set; }
    [Export] public Control SettingsControl { get; set; }
    [Export] public Button ResumeButton { get; set; }
    [Export] public Button MainMenuButton { get; set; }
    [Export] public Button QuitButton { get; set; }
    [Export] public Button SettingsButton { get; set; }
    [Export] public PackedScene MainMenuScene { get; set; }

    private GameManager GameManager => GameManager.Instance;
    private UIManager UIManager => UIManager.Instance;

    public override void _Ready()
    {
        ResumeButton.FocusMode = Control.FocusModeEnum.All;
        MainMenuButton.FocusMode = Control.FocusModeEnum.All;
        QuitButton.FocusMode = Control.FocusModeEnum.All;
        SettingsButton.FocusMode = Control.FocusModeEnum.All;

        ResumeButton.Pressed += OnResumePressed;
        MainMenuButton.Pressed += OnMainMenuPressed;
        QuitButton.Pressed += OnQuitPressed;
        SettingsButton.Pressed += OnSettingsPressed;

        PauseMenuControl.Hide();

        if (InputDeviceManager.Instance != null)
            InputDeviceManager.Instance.DeviceChanged += OnDeviceChanged;
        PauseMenuControl.VisibilityChanged += OnVisibilityChanged;
    }

    public override void _ExitTree()
    {
        if (InputDeviceManager.Instance != null)
            InputDeviceManager.Instance.DeviceChanged -= OnDeviceChanged;
        PauseMenuControl.VisibilityChanged -= OnVisibilityChanged;
    }

    private void OnVisibilityChanged()
    {
        if (PauseMenuControl.IsVisibleInTree() && InputDeviceManager.Instance?.IsPointerless == true)
            GrabFirstFocus();
    }

    private void OnDeviceChanged(int device)
    {
        var d = (InputDeviceManager.InputDevice)device;
        if (d != InputDeviceManager.InputDevice.Mouse && PauseMenuControl.IsVisibleInTree())
            GrabFirstFocus();
    }

    private void GrabFirstFocus() => ResumeButton.GrabFocus();

    public override void _UnhandledInput(InputEvent @event)
    {
        if (!@event.IsActionPressed("pause")) return;
        if (UIManager.IsVisibleOnStack(PauseMenuControl))
            OnResumePressed();
        else
        {
            UIManager.PushScreen(PauseMenuControl);
            GameManager.PauseGame();
        }
    }

    private void OnSettingsPressed()
    {
        UIManager.PushScreen(SettingsControl);
        GameManager.PauseGame();
    }

    private void OnQuitPressed()
    {
        GameManager.QuitGame();
    }

    private void OnMainMenuPressed()
    {
        GameManager.ResumeGame();
        GameStateStore.Instance?.ResetSession();
        GetTree().ChangeSceneToPacked(MainMenuScene);
    }

    private void OnResumePressed()
    {
        UIManager.PopScreen();
        GameManager.ResumeGame();
    }
}