// __author__ = Juan Carlos De Abreu (jcabreur@gmail.com)

/**
 * TODO(jcabreur): write a general comment here
 */

#ifndef GUI_WINDOW_MANAGEMENT_H__
#define GUI_WINDOW_MANAGEMENT_H__

#include "vector"

#include "../global.h"
#include "../app.h"
#include "../Base/Singleton.h"
#include "button.h"
#include "window.h"
#include "console.h"

BEGIN_TEG_NAMESPACE();
// TODO: Deberia ordenarlas vantanas en el manejador de ventanas por la profundidad de las mismas
//       tambien las ventnas deberia o estar almacenadas en una lista o las ventanas deberian tener el indice de las
//       ventanas que contean de esta manera solo el manejador de ventanas tendria acceso a las ventanas, 
//       y no cada ventana con una lista de ventanas ... 

// TODO: crear display list para cada componente de las ventanas y asi solo se realizaria una llamada al display list 
//       de dicha componente en el manejador de ventanas

// TODO: crear alguna estructura basica para menus ...

#define GL_WRITE(x, y, text) gui::WindowManagement::GetInstance().glWrite(x, y, text)



#define GUI_TEXTURE		gui::WindowManagement::GetInstance().GetGuiTexture()
#define FONT_TEXTURE	gui::WindowManagement::GetInstance().GetFontTexture()
#define FONT_LIST	gui::WindowManagement::GetInstance().GetFontList()

// TODO: add methods to get the values fo fontTextures and GUItextures

// TODO: have a define to access more easy the WindowManagement structure

// TODO: tener un atributo que indique si se pueden ordenar las ventanes, es decir si no hay una ventana 
//       desplegada que como un messageBox, que no se pueden tocar las otras hasta que no se cierre esa ..

// TODO: el addWindow deberia automaticamente asignarle el zOrder de la ventana ...

namespace gui {

// definicion del sistema manejador de las ventanas
class WindowManagement : public Singleton<WindowManagement> {
 public:
  // WindowManagement constructor and destructor.
  WindowManagement();
  ~WindowManagement();

  // 
  inline int GetGuiTexture() const { return GUITexture; }
  inline int GetFontTexture() const { return fontTexture; }
  inline int GetFontList() const { return fontList; }
  inline Console& console() { return console_; }
  inline bool is_console_enable() const { return is_console_enable_; }
  inline std::vector<Window>& windows() { return windows_; }
  inline void set_is_console_enable(bool is_console_enable) { is_console_enable_ = is_console_enable; }

  // Methods
  void render() ;				// funcion para pintar las ventanas de la aplicacion
  bool loadConfig();					// funcion para cargar la configuracion de la interfaz
  void addWindow(Window window_);	// funcion para agregar una ventana al manejador de ventanas

  // TODO: esta funcio creo que deberia ser global ... tipo singleton (dentro de utils...)
  // definicion de la funcion para escribir el texto ...()
  void glWrite(int x, int y, const char *str);	// TODO: change to _TCHAR

  // funcion para construtir las letras de ...()
  bool buildFont(const char *path);

  // funcion para ...()
  void onMouseUp();

  // funcion para ..()
  bool onMouseDown(Window *window);

 private:
  // WindowManagement attributes.
  int GUITexture;					// id para la textura de la interfaz	
  int fontTexture;					// id para la textura de las letras
  int fontList;					// display list para las letras ..()

  // Prueba para la consola ....
  bool is_console_enable_;
  Console console_;

  Button *buttonPressed;			// apuntador al boton presionado ...()
  std::vector<Window> windows_;	// ventanas de la aplicacion ...()
  //std::list<GUI::Window> window;	// ventanas de la aplicacion ...()
};

// funcion para pintar el mouse
void drawMouse();

};  // namespace gui

END_TEG_NAMESPACE();

#endif  // GUI_WINDOW_MANAGEMENT_H__
