#ifndef BLUECORE_RENDER_WINDOW_H
#define BLUECORE_RENDER_WINDOW_H

// system includes
#include <vector>

// library includes
#include "GL/glew.h"
#include "GL/glfw.h"

// project includes
#include "Math/Vector.h"
#include "Utilities/sigslot.h"
#include "Utilities/Referenced.h"

namespace BlueCore
{

class RenderWindow : public Referenced
{

  private:

    static void WindowSizeCallback(int width, int height);
    static int WindowCloseCallback();
    static void WindowRefreshCallback();

    static void MousePosCallback(int x, int y);
    static void MouseButtonCallback(int button, int action);
    static void MouseWheelCallback(int pos);
    static void KeyCallback(int key, int action);
    static void CharCallback(int character, int action);

    bool _Resized;
    bool _Initialized;
    bool _Closed;
    int _Width, _Height;

    void resizeWindow(int width, int height);

  public:

    sigslot::signal0<> WindowCloseSignal;
    sigslot::signal2<int, int> WindowResizeSignal;
    sigslot::signal0<> WindowRefreshSignal;

    sigslot::signal2<int, int> MouseMoveSignal;
    sigslot::signal2<int, int> MouseButtonSignal;
    sigslot::signal1<int> MouseWheelSignal;
    sigslot::signal2<int, int> KeySignal;
    sigslot::signal1<int> CharSignal;

  public:

    RenderWindow();
    ~RenderWindow();

    bool create(int width, int height, int pixelbits, int depthbits,
        int stencilbits, bool fullscreen);

    void destroy();
    void closeWindow();
    int getWidth();
    int getHeight();

    bool isOpen();
};
}

#endif
