//--------------------------------------------------------------------------------------
// 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 Settings.h
/// Clase para manejar la configuración de la aplicación.
/// Fichero con la especificación de los atributos y funciones para el mantenimiento de
/// la configuración personalizada de la aplicación de forma persistente
//--------------------------------------------------------------------------------------
#pragma once
#ifndef __CSETTINGS_H__
#define __CSETTINGS_H__

#include "XMLIO.h"

//--------------------------------------------------------------------------------------
// Constantes
//--------------------------------------------------------------------------------------
/// Fichero externo con los datos de configuración de la aplicación.
#define     SETTINGS_FILE               L".\\config\\settings.xml"

// Valores permitidos para el ComboBox de QUALITY
#define     SETTINGS_Q_CUSTOM           0
#define     SETTINGS_Q_HIGH             1
#define     SETTINGS_Q_NORMAL           2
#define     SETTINGS_Q_LOW              3

// Valores permitidos para el ComboBox de FILTER
#define     SETTINGS_F_POINT            0
#define     SETTINGS_F_LINEAR           1
#define     SETTINGS_F_ANISOT           2

// Valores por defecto para cada opción
#define     SETTINGS_DFL_QUALITY        0
#define     SETTINGS_DFL_WINFULL        0
#define     SETTINGS_DFL_STADISTICS     1
#define     SETTINGS_DFL_RESOLUTION     MAKELONG(640,480)
#define     SETTINGS_DFL_FILTER         0
#define     SETTINGS_DFL_MIPMAPPING     1

#define     SETTINGS_DFL_EFFECTS        100

#define     SETTINGS_DFL_NOMPLAYER      L"Anonymous"

/// Ancho en pixeles mínimo permitido para el modo de video
#define     MIN_WIDTH                   640
/// Alto en pixeles mínimo permitido para el modo de video
#define     MIN_HEIGHT                  480

//--------------------------------------------------------------------------------------
/// Tipo de dato con la estructura para mantener la configuración de la aplicación.
//--------------------------------------------------------------------------------------
typedef struct
{
    // Display settings
    int m_iQuality;                         ///< Calidad del display
    int m_iWinFull;                         ///< Pantalla completa activada o desactivada
    int m_iStadistics;                      ///< Estadísticas gráficas activadas o desactivadas
    unsigned long m_ulResolution;           ///< Resolución de pantalla
    int m_iFilter;                          ///< Tipo de filtro de texturas
    int m_iMipMapping;                      ///< MipMapping activado o desactivado

    // Sound settings
    int m_iEffects;                         ///< Volumen de los efectos sonoros

    // Game settings
    WCHAR m_awNomPlayer[MAX_STRING+1];      ///< Nombre por defecto para el jugador local

} SDataSettings;

//--------------------------------------------------------------------------------------
/// Clase para manejar la configuración de la aplicación.
//--------------------------------------------------------------------------------------
class CSettings
{

private:  // Campos miembro

    CXMLIO               *m_pXMLIO;			///< Puntero a una instancia del parseador XML

    /// Estructura con todos los datos de configuración de la aplicación.
    SDataSettings m_DataSettings;
    /// Flag que indica si hay cambios aún no aplicados en la configuración interna
    bool m_bChanges;
    /// Flag que indica si hay cambios aún no aplicados en la configuración del fichero externo
    bool m_bChangesFile;

    /// Carga los datos de configuración del fichero externo
    void LoadFile(void);
    /// Guarda los datos de configuración del fichero externo
    void SaveFile(void);

public: // Métodos públicos

    /// Constructor
    CSettings();
    /// Destructor
    ~CSettings();

    /// Aplica la configuración establecida
    void Apply(int Section);
    /// Recarga el GUI con los datos
    void RefreshControls(int Section);
    /// Recarga los datos con el GUI
    void RefreshData(int Section);

    /// Toma la estructura con los datos de configuración
    SDataSettings *getData(void)        {return &m_DataSettings;}
    /// Toma el ancho del dispositivo definido en la configuración
    DWORD getWidth(void)                {return max(LOWORD(m_DataSettings.m_ulResolution), MIN_WIDTH);}
    /// Toma el alto del dispositivo definido en la configuración
    DWORD getHeigth(void)               {return max(HIWORD(m_DataSettings.m_ulResolution), MIN_HEIGHT);}
};

#endif
