#ifndef ARC_GRAPHICS_KEYBOARD_H_
#define ARC_GRAPHICS_KEYBOARD_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

/**
 * @brief predefien ARC_Input so as not to get circular reference
*/
typedef struct ARC_Input ARC_Input;

typedef struct ARC_Keyboard ARC_Keyboard;

typedef struct ARC_KeyboardInfo ARC_KeyboardInfo;

typedef enum ARC_KeyboardState {
    ARC_KEY_NONE,
    ARC_KEY_PRESSED,
    ARC_KEY_RELEASED
} ARC_KeyboardState;

#define ARC_KEYBOARD_BUTTON_NUM 239

void ARC_Keyboard_CreateWithInput(ARC_Keyboard **keyboard, ARC_Input *input);

void ARC_Keyboard_Destroy(ARC_Keyboard *keyboard);
void ARC_Keyboard_Update(ARC_Keyboard *keyboard);

typedef enum ARC_KeyboardKey {
    ARC_KEY_A,
    ARC_KEY_B,
    ARC_KEY_C,
    ARC_KEY_D,
    ARC_KEY_E,
    ARC_KEY_F,
    ARC_KEY_G,
    ARC_KEY_H,
    ARC_KEY_I,
    ARC_KEY_J,
    ARC_KEY_K,
    ARC_KEY_L,
    ARC_KEY_M,
    ARC_KEY_N,
    ARC_KEY_O,
    ARC_KEY_P,
    ARC_KEY_Q,
    ARC_KEY_R,
    ARC_KEY_S,
    ARC_KEY_T,
    ARC_KEY_U,
    ARC_KEY_V,
    ARC_KEY_W,
    ARC_KEY_X,
    ARC_KEY_Y,
    ARC_KEY_Z,

    ARC_KEY_0,
    ARC_KEY_1,
    ARC_KEY_2,
    ARC_KEY_3,
    ARC_KEY_4,
    ARC_KEY_5,
    ARC_KEY_6,
    ARC_KEY_7,
    ARC_KEY_8,
    ARC_KEY_9,

    ARC_KEY_SPACE,
    ARC_KEY_ESC,
    ARC_KEY_ENTER,
} ARC_Keyboard_Key;

ARC_KeyboardState ARC_Keyboard_GetState(ARC_Keyboard *keyboard, enum ARC_KeyboardKey key);

#ifdef __cplusplus
}
#endif

#endif // !ARC_GRAPHICS_KEYBOARD_H_