//
// Created by trotfunky on 07/10/2019.
//

#include "KeyStateManager.h"
#include <iostream>

std::map<unsigned char,bool> KeyStateManager::ascii_keys_status = {};
std::map<int,bool> KeyStateManager::special_keys_status = {};

void KeyStateManager::register_glut_callbacks()
{
    glutKeyboardFunc(KeyStateManager::key_press);
    glutKeyboardUpFunc(KeyStateManager::key_up);
    glutSpecialFunc(KeyStateManager::special_key_press);
    glutSpecialUpFunc(KeyStateManager::special_key_up);
}

bool KeyStateManager::is_key_pressed(unsigned char key)
{
    if (ascii_keys_status.find(key) == ascii_keys_status.end())
    {
        return false;
    }
    return ascii_keys_status.at(key);
}

bool KeyStateManager::is_special_key_pressed(int key)
{
    if (special_keys_status.find(key) == special_keys_status.end())
    {
        return false;
    }
    return special_keys_status.at(key);
}

void KeyStateManager::key_press(unsigned char event_key, int mouse_x, int mouse_y)
{
    update_key(event_key,true);
}

void KeyStateManager::key_up(unsigned char event_key, int mouse_x, int mouse_y)
{
    update_key(event_key,false);
}

void KeyStateManager::special_key_press(int event_key, int mouse_x, int mouse_y)
{
    update_special_key(event_key,true);
}

void KeyStateManager::special_key_up(int event_key, int mouse_x, int mouse_y)
{
    update_special_key(event_key,false);
}

void KeyStateManager::update_key(unsigned char event_key, bool new_status)
{
    if (ascii_keys_status.find(event_key) != ascii_keys_status.end())
    {
        ascii_keys_status.at(event_key) = new_status;
    }
    else
    {
        ascii_keys_status.insert({event_key,new_status});
    }
}

void KeyStateManager::update_special_key(int event_key, bool new_status)
{
    if (special_keys_status.find(event_key) != special_keys_status.end())
    {
        special_keys_status.at(event_key) = new_status;
    }
    else
    {
        special_keys_status.insert({event_key,new_status});
    }
}
