#ifndef INPUT_HPP_INCLUDED
#define INPUT_HPP_INCLUDED

#include "Types/Point.hpp"
#include <string>
#include <cstdint>

typedef enum ScrollDirection
{
    SCROLL_DOWN = 0,
    SCROLL_UP = 1
} ScrollDirection;

typedef enum Button
{
    BUTTON_NONE = 0,
    BUTTON_LEFT = 1,
    BUTTON_MIDDLE = 2,
    BUTTON_RIGHT = 3
} Button;

typedef enum Key
{
    KEY_BACKSPACE = 8,
    KEY_TAB = 9,
    KEY_NEWLINE = 10,
    KEY_SHIFT = 16,
    KEY_CTRL = 17,
    KEY_ALT = 18,
    KEY_ESC = 27,
    KEY_DEL = 127,
    KEY_LEFT = 256,
    KEY_UP = 257,
    KEY_RIGHT = 258,
    KEY_DOWN = 259,
    KEY_F1 = 260,
    KEY_F2 = 261,
    KEY_F3 = 262,
    KEY_F4 = 263,
    KEY_F5 = 264,
    KEY_F6 = 265,
    KEY_F7 = 266,
    KEY_F8 = 267,
    KEY_F9 = 268,
    KEY_F10 = 269,
    KEY_F11 = 270,
    KEY_F12 = 271
} Key;

void SetupInput();
void GainFocus();
void LoseFocus();
bool IsKeyDown(std::int32_t K);
void ScrollUp();
void ScrollDown();
void MouseDown(std::int32_t B);
void MouseUp(std::int32_t B);
void MouseMove(Point P);
void MouseMove(std::int32_t X, std::int32_t Y);
void KeyDown(std::int32_t K);
void KeyUp(std::int32_t K);
void KeyHold(std::int32_t K, std::uint32_t Duration);
void KeyRelease(std::int32_t K);
bool ShiftNeeded(std::int32_t K);
Point GetMousePos();

#endif // INPUT_HPP_INCLUDED
