#pragma once

#include <GL/glew.h>
#include <GLFW/glfw3.h>

#include "utils.h"

namespace kek {

typedef generic_callable_t<GLFWwindow *> PeriodicCallback; // periodicCallback(GLFWwindow *window)
typedef generic_callable_t<GLFWwindow *, int, int, int, int> KeyCallback; // keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods)
typedef generic_callable_t<GLFWwindow *, double, double> MouseCallback; // mouseCallback(GLFWwindow *window, double x, double y)

typedef unsigned int InputListener;

}

namespace kek::Input {

InputListener addPeriodicCallback(PeriodicCallback callback);

void removePeriodicCallback(InputListener listener);

InputListener addKeyListener(KeyCallback callback);

void removeKeyListener(InputListener listener);

InputListener addMouseListener(MouseCallback callback);

void removeMouseListener(InputListener listener);

}
