// Copyright 2016 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.

#include <SDL_keyboard.h>

#include "input_core/devices/Keyboard.h"

Keyboard::Keyboard() {
}

Keyboard::~Keyboard() {
}

bool Keyboard::InitDevice(int number, const std::map<std::string, std::vector<KeyMap::KeyTarget>>& keyMap) {
    keyMapping = keyMap;
    return true;
}

void Keyboard::ProcessInput() {
    std::map<KeyboardKey, bool> keysPressedCopy;
    {
        std::lock_guard<std::mutex> lock(m);
        keysPressedCopy = keysPressed;
    }
    for (const auto &ent1 : keyMapping) {
        int scancode = std::stoul(ent1.first, nullptr, 16);
        KeyboardKey proxy = KeyboardKey(0, scancode, "");
        if (keysPressedCopy[proxy] == true && keysPressedLast[scancode] == false) {
            for (const auto& key : ent1.second) {
                KeyMap::PressKey(key, 1.0);
            }
            keysPressedLast[scancode] = true;
        }
        else if (keysPressedCopy[proxy] == false && keysPressedLast[scancode] == true) {
            for (const auto& key : ent1.second) {
                KeyMap::ReleaseKey(key);
            }
            keysPressedLast[scancode] = false;
        }
    }
}

bool Keyboard::CloseDevice() {
    return true;
}

void Keyboard::KeyPressed(KeyboardKey key) {
    std::lock_guard<std::mutex> lock(m);
    keysPressed[key] = true;
}

void Keyboard::KeyReleased(KeyboardKey key) {
    std::lock_guard<std::mutex> lock(m);
    keysPressed[key] = false;
}