//
//  Window.h
//  Framework
//
//  Created by John Ryland on 5/10/17.
//  Copyright © 2017 John Ryland. All rights reserved.
//

#pragma once

#ifndef Window_h
#define Window_h


#include <functional>


enum MouseButton
{
  NoButton = 0,
  LeftButton = 1 << 0,
  MiddleButton = 1 << 1,
  RightButton = 1 << 2,
};


struct MouseEvent
{
  float m_x, m_y;
  int   m_buttons;
};


enum WindowStyleFlags
{
  NoBorder = 0,
  Titlebar = 1 << 0,
  Closable = 1 << 1,
  Minimizable = 1 << 2,
  Resizable = 1 << 3,
  Utility = 1 << 4,
};


class Window
{
public:
  Window();
  ~Window();

  void setWindowStyle(int a_styleFlags);
  void setGeometry(int a_x, int a_y, int a_width, int a_height);
  void setTitle(const char* a_title);
  void show();

private:
  friend class View;
  friend class GLView;
  friend class Label;
  void* m_platformHandle;
};


class View
{
public:
  View(const Window& a_parent);
  ~View();

  void setGeometry(int a_x, int a_y, int a_width, int a_height);
  void setColor(float a_red, float a_green, float a_blue, float a_alpha);
  void onMouseEvent(std::function<void(const MouseEvent&)> a_callback);

private:
  friend class Label;
  void* m_platformHandle;
};


class GLView
{
public:
  GLView(const Window& a_parent);
  ~GLView();

  void setGeometry(int a_x, int a_y, int a_width, int a_height);

  void onPrepare(std::function<void()> a_callback);
  void onUpdate(std::function<void()> a_callback);
  void onDraw(std::function<void()> a_callback);
  void onClose(std::function<void()> a_callback);
  void onResize(std::function<void(float a_width, float a_height)> a_callback);
  void onMouseEvent(std::function<void(const MouseEvent&)> a_callback);

private:
  void* m_platformHandle;
};


class Label
{
public:
  Label(const Window& a_parent);
  Label(const View& a_parent);
  ~Label();

  void setGeometry(int a_x, int a_y, int a_width, int a_height);
  void setColor(float a_red, float a_green, float a_blue, float a_alpha);
  void setText(const char* a_text);
  void setFontSize(int a_size);
  void onMouseEvent(std::function<void(const MouseEvent&)> a_callback);

private:
  void* m_platformHandle;
};


#endif /* Window_h */
