#include "HotkeysManager.h"
#include <vector>

struct Hotkey {
    int vk;
    Modifier mods;
    std::function<void()> callback;
    bool wasPressed = false;
};

static std::vector<Hotkey> g_hotkeys;

static bool IsModifierDown(reshade::api::effect_runtime* rt, Modifier m) {
    if ((int)m & (int)Modifier::Alt && !rt->is_key_down(VK_MENU))    return false;
    if ((int)m & (int)Modifier::Ctrl && !rt->is_key_down(VK_CONTROL)) return false;
    if ((int)m & (int)Modifier::Shift && !rt->is_key_down(VK_SHIFT))   return false;
    return true;
}

void RegisterHotkey(int vk, Modifier mods, std::function<void()> callback) {
    g_hotkeys.push_back({ vk, mods, std::move(callback) });
}

void ProcessHotkeys(reshade::api::effect_runtime* runtime) {
    for (auto& hotkey : g_hotkeys) {
        bool pressed = IsModifierDown(runtime, hotkey.mods) && runtime->is_key_down(hotkey.vk);

        if (pressed && !hotkey.wasPressed) hotkey.callback();

        hotkey.wasPressed = pressed;
    }
}
