#include "Key.h"

Key Key::keyArray[Key::NUMBER_OF_KEYS];
int Key::mappingArray[Key::NUMBER_OF_KEYS];

Key::Key()
{
}

bool Key::isDown(int mapping)
{
    return isInRange(mapping) && keyArray[mappingArray[mapping]].down;
}

bool Key::isReleased(int mapping)
{
    return isInRange(mapping) && keyArray[mappingArray[mapping]].shouldRelease;
}

unsigned int Key::getDownTime(int mapping)
{
    bool m = isInRange(mapping);
    return m * keyArray[mappingArray[mapping * m]].downTime;
}

void Key::resetDownTime(int mapping)
{
    keyArray[mappingArray[mapping * isInRange(mapping)]].downTime = 0;
}

bool Key::map(int mapping, int key)
{
    bool b = isInRange(mapping) && isInRange(key);
    mappingArray[mapping * b] = b * key;
}

bool Key::isInRange(int i)
{
    return i >= 0 && i < NUMBER_OF_KEYS;
}

void Key::init()
{
    for(int i = 0; i < NUMBER_OF_KEYS; i++)
    {
        mappingArray[i] = 0;
    }
}

void Key::tick()
{
    for(int i = 0; i < NUMBER_OF_KEYS; i++)
    {
        keyArray[i].downTime += keyArray[i].down;
        
        keyArray[i].down = keyArray[i].down && !keyArray[i].shouldRelease;
        keyArray[i].downTime *= !keyArray[i].shouldRelease;
        keyArray[i].shouldRelease = false;
    }
}

bool Key::press(int key)
{
    int index = isInRange(key) * key;
    keyArray[index].down = true;
    keyArray[index].shouldRelease = false;
}

bool Key::release(int key)
{
    int index = isInRange(key) * key;
    keyArray[index].shouldRelease = true;
}