//--------------------------------------------------------------------------------------
// Copyright (C) 2008 http://shift.delblanco.es
//--------------------------------------------------------------------------------------
// SHIFT Videogame is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by the
// Free Software Foundation, either version 3 of the License, or later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
//--------------------------------------------------------------------------------------
/// \file GUI.h
/// Clase para manejar el interfaz gráfico de usuario.
/// Fichero con la especificación de los atributos y funciones para el manejo de
/// los componentes gráficos referentes al interfaz gráfico de usuario
//--------------------------------------------------------------------------------------
#pragma once
#ifndef __CGUI_H__
#define __CGUI_H__

//--------------------------------------------------------------------------------------
// Ficheros de cabecera
//--------------------------------------------------------------------------------------
#include <d3d9.h>
#include <vector>

//--------------------------------------------------------------------------------------
// Constantes
//--------------------------------------------------------------------------------------
// Tipos de GUI
#define     GUI_TYPE_MENU_INIT         100
#define     GUI_TYPE_SETT              101
#define     GUI_TYPE_SETT_DISPLAY      102
#define     GUI_TYPE_SETT_SOUND        103
#define     GUI_TYPE_SETT_GAME         104
#define     GUI_TYPE_NEW_GAME          105
#define     GUI_TYPE_NEW_GAME2         106
#define     GUI_TYPE_SELECT_ARENA      107
#define     GUI_TYPE_SELECT_VEHICLE1   108
#define     GUI_TYPE_SELECT_VEHICLE2   109
#define     GUI_TYPE_INTERFAZ_PREGAME  110
#define     GUI_TYPE_INTERFAZ_GAME     111
#define     GUI_TYPE_PAUSE_GAME        112
#define     GUI_TYPE_WARNING           113
#define     GUI_TYPE_WARNING_EXIT      114
#define     GUI_TYPE_WARNING_WIN       115
#define     GUI_TYPE_WARNING_RANK      116
#define     GUI_TYPE_WARNING_LOST      117
#define     GUI_TYPE_WARNING_DIE       118

// Fuentes
#define     GUI_FONT_MENU              200
#define     GUI_FONT_TITLE             201
#define     GUI_FONT_TITLE_2           202
#define     GUI_FONT_WARNING           203
#define     GUI_FONT_CREDITS           204
#define     GUI_FONT_INFO              205
#define     GUI_FONT_INFO_2            206
#define     GUI_FONT_INFO_3            207
#define     GUI_FONT_COUNTER           208
#define     GUI_FONT_DESCRIPTION       209
#define     GUI_FONT_MAP			   210

// Controles botones
#define     GUI_BTN_NEWGAME            300
#define     GUI_BTN_SETT               301
#define     GUI_BTN_EXIT               302
#define     GUI_BTN_ACCEPT             303
#define     GUI_BTN_CANCEL             304
#define     GUI_BTN_1PLAYER            305
#define     GUI_BTN_2PLAYER            306
#define     GUI_BTN_2PLAYER_FIGHT      307
#define     GUI_BTN_2PLAYER_OBJS       308
#define     GUI_BTN_GAME_PAUSE         309
#define     GUI_BTN_GAME_OPTIONS       310
#define     GUI_BTN_GAME_EXIT          311
#define     GUI_BTN_SELECT_PRIOR       312
#define     GUI_BTN_SELECT_NEXT        313
#define     GUI_BTN_SETT_DISPLAY       314
#define     GUI_BTN_SETT_SOUND         315
#define     GUI_BTN_SETT_GAME          316

// Controles texto
#define     GUI_STATIC_TITULO          400
#define     GUI_STATIC_WARNING         401
#define     GUI_STATIC_INFO            402
#define     GUI_STATIC_INFO_2          403
#define     GUI_STATIC_P1_TITLE        404
#define     GUI_STATIC_P1_HEALTH       405
#define     GUI_STATIC_P1_ROCKETS      406
#define     GUI_STATIC_P1_MINES        407
#define     GUI_STATIC_P1_OBJECTIVES   408
#define     GUI_STATIC_P2_TITLE        409
#define     GUI_STATIC_P2_HEALTH       410
#define     GUI_STATIC_P2_ROCKETS      411
#define     GUI_STATIC_P2_MINES        412
#define     GUI_STATIC_P2_OBJECTIVES   413
#define     GUI_STATIC_TOTAL_TIME      414
#define     GUI_STATIC_TITULO_2        415
#define     GUI_STATIC_COUNTER         416
#define     GUI_STATIC_DESCRIP         417
#define     GUI_STATIC_SETT            418
#define     GUI_STATIC_ARENA_INFO      419
#define     GUI_STATIC_ARENA_MINFO     420
#define     GUI_STATIC_VEHICLE_INFO    421
#define     GUI_STATIC_VEHICLE_MINFO   422
#define     GUI_STATIC_GAME_INFO       423
#define     GUI_STATIC_MAP_OBJ         424
#define     GUI_STATIC_MAP_P1          425
#define     GUI_STATIC_MAP_P2          426
#define     GUI_STATIC_RANK            427

// Controles slider
#define     GUI_SLIDER_SETT_MUSIC      600
#define     GUI_SLIDER_SETT_EFFECTS    601
#define     GUI_SLIDER_SETT_MULTI_1    602
#define     GUI_SLIDER_SETT_MULTI_2    603

// Controles editbox
#define     GUI_EDITBOX_SETT_NAME      700
#define     GUI_EDITBOX_MAP            701

// Controles listbox
#define     GUI_LISTBOX_SELECT_ARENA   800
#define     GUI_LISTBOX_SELECT_VEHI1   801
#define     GUI_LISTBOX_SELECT_VEHI2   802
#define     GUI_LISTBOX_CREDITS_UP     803
#define     GUI_LISTBOX_CREDITS_DW     804
#define     GUI_LISTBOX_CONTROLS1      805
#define     GUI_LISTBOX_CONTROLS2      806

// Controles combobox
#define     GUI_CMBBX_SETT_QUALITY     900
#define     GUI_CMBBX_SETT_WINFULL     901
#define     GUI_CMBBX_SETT_STADISTICS  902
#define     GUI_CMBBX_SETT_RESOLUTION  903
#define     GUI_CMBBX_SETT_FILTER      904
#define     GUI_CMBBX_SETT_MIPMAPPING  905

// Aspecto de los controles
#define     GUI_BTN_W                  190
#define     GUI_BTN_H                  50

#define     GUI_BTN_W_2                110
#define     GUI_BTN_H_2                30

#define     GUI_BTN_W_3                125
#define     GUI_BTN_H_3                20

#define     GUI_BTN_H_SPACE            80
#define     GUI_BTN_W_SPACE            10

#define     GUI_SETT_W                 200
#define     GUI_SETT_H                 20
#define     GUI_SETT_H_INI             150
#define     GUI_SETT_H_SEP             28

/// Número máximo permitido de elementos en un combobox
#define     GUI_MAX_ITEMS_COMBOBOX     256

/// Manejador de eventos
void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl );

//--------------------------------------------------------------------------------------
/// Clase para manejar el interfaz gráfico de usuario.
//--------------------------------------------------------------------------------------
class CGUI
{

private:  // Campos miembro

    bool                 m_bInit;               ///< Flag que indica si el objeto está inicializado
    IDirect3DDevice9*    m_pDevice;             ///< Puntero al dispositivo de DirectX

    CDXUTDialog         *m_pGUI;                ///< Cuadro para contener objetos
    ID3DXFont           *m_pFont;               ///< Para dibujar textos
    ID3DXSprite         *m_pTextSprite;         ///< Para efectos Sprite

    bool                 m_bStadistics;         ///< Flag para mostrar las estadísticas

    int                  m_iType;               ///< Tipo de GUI mostrado actualmente
    int                  m_ioldType;            ///< Tipo de GUI mostrado anteriormente

    int                  m_iTypeGame;           ///< Tipo de juego seleccionado
    int                  m_iTypeArena;          ///< Tipo de arena seleccionado
    int                  m_iTypeVehicle;        ///< Tipo de vehículo seleccionado
    bool                 m_bPaused;             ///< Indica si estamos o no en pausa
    bool                 m_bGamming;            ///< Indica si estamos o no jugando (pausados o no)

    UINT                 m_uWidth;              ///< Dimensiones actuales del dispositivo (ancho)
    UINT                 m_uHeight;             ///< Dimensiones actuales del dispositivo (alto)
    UINT                 m_uMidW;               ///< Dimensiones actuales del dispositivo (ancho/2)
    UINT                 m_uMidH;               ///< Dimensiones actuales del dispositivo (alto/2)

    int                  m_iArena;              ///< Índice de la arena actualmente seleccionada
    int                  m_iVehicle1;           ///< Índice del vehículo del jugador 1 actualmente seleccionado
    int                  m_iVehicle2;           ///< Índice del vehículo del jugador 2 actualmente seleccionado
    int                  m_inumArenas;          ///< Número total de arenas encontradas
    int                  m_inumVehicles;        ///< Número total de vehículos encontrados

    /// Vector en el que cada posición es el valor de un índice de los comboboxes del GUI
    int m_piIndex[GUI_MAX_ITEMS_COMBOBOX];

    /// Lista de controles del GUI
    std::vector<CDXUTControl *> m_aCtrls;

    /// Para ocultar todos los elementos del GUI
    void HideAll(void);

public: // Métodos públicos

    /// Constructor
    CGUI();
    /// Destructor
    ~CGUI();

    /// Carga el GUI ante un CreateDevice
    bool initialize();
    /// Renderiza el GUI ante un FrameRender
    void render();
    /// Actualiza el GUI ante un FrameMove
    void update();
    /// Restaura objetos ante un ResetDevice
    void restore();
    /// Libera objetos ante un LostDevice
    void free();
    /// Libera el GUI ante un DestroyDevice
    void Release();

    /// Inicializa algunas variables y elementos de la configuración del juego
    void iniGameConfig(void);
    /// Cambia el marcador indicado con el número indicado
    void setMarcador(int num, int marcador);
    /// Cambia el texto de diferentes etiquetas personalizables
    void setText(LPCWSTR txt, int Type);
    /// Para lanzar un evento
    void throwEvent(int ID);

    /// Vector que retorna un puntero a un entero con el valor indicado,
    /// se usa para gestionar los elementos de los comboboxes del GUI
    int *getIndex(int id)          {return &(m_piIndex[id]);}

    /// Establece la arena con el índice dado, cargando todas antes si fuese necesario
    bool setArena(int dIndex);
    /// Establece el vehículo con el índice dado, cargando todos antes si fuese necesario
    bool setVehicle(int numPlayer, int dIndex);
    /// Establece la siguiente arena de la lista
    bool nextArena(void);
    /// Establece la anterior arena de la lista
    bool priorArena(void);
    /// Establece el siguiente vehículo de la lista
    bool nextVehicle(void);
    /// Establece el anterior vehículo de la lista
    bool priorVehicle(void);

	// Función observadora de las dimensiones actuales del dispositivo (ancho)
	UINT getWidth(void)			   {return m_uWidth;}
	// Función observadora de las dimensiones actuales del dispositivo (alto)
	UINT getHeight(void)		   {return m_uHeight;}
	// Función observadora de las dimensiones actuales del dispositivo (ancho/2)
	UINT getMidW(void)			   {return m_uMidW;}
	// Función observadora de las dimensiones actuales del dispositivo (alto/2)
	UINT getMidH(void)			   {return m_uMidH;}

    /// Establece el tipo de GUI
    void setTypeGUI(int dType);
    /// Funcion observadora del tipo de GUI actual
    int getTypeGUI(void)           {return m_iType;}
    /// Funcion observadora del tipo de GUI anterior
    int getOldTypeGUI(void)        {return m_ioldType;}

    /// Muestra u oculta las estadísticas
    void setStadistics(bool dType) {m_bStadistics = dType;}
    /// Comprueba si están o no las estadísticas activadas
    bool getStadistics(void)       {return m_bStadistics;}

    /// Función para establecer el tipo de juego seleccionado
    void setTypeGame(int dType)    {m_iTypeGame = dType;}
    /// Funcion observadora del tipo de juego
    int getTypeGame(void)          {return m_iTypeGame;}

    /// Funcion observadora del tipo de arena
    int getTypeArena(void)         {return m_iTypeArena;}
    /// Funcion observadora del tipo de vehículo
    int getTypeVehicle(void)       {return m_iTypeVehicle;}
    /// Función observadora del nombre del jugador actual
    LPCWSTR getLocalPlayerName(void)  {return m_pGUI->GetEditBox(GUI_EDITBOX_SETT_NAME)->GetText();}
    /// Comprueba si estamos o no en modo pausa
    bool getPaused(void)           {return m_bPaused;}
    /// Comprueba si estamos o no en modo juego
    bool getGamming(void)          {return m_bGamming;}

    /// Para acceder directamente al objeto GUI
    CDXUTDialog *getGUI()          {return m_pGUI;}

};

#endif
