/*********************************************************************
*	SystemConfig
*	HEADER FILE
*	Autor:	Michal Jirouš
*	Datum: 7.7.2008
*	Soubor: systemconf.h
*	Popis: Modul spravujici zakladni informace o systemu jako jsou
* 			rozliseni, bitova hloubka, jazyk. Nacita config ze souboru
* 			a kontroluje dostupnost nastavenych vlastnosti
**********************************************************************/

#ifndef SYSTEMCONF_
#define SYSTEMCONF_

#include <string>
#include <map>
#include <SDL/SDL.h>




namespace systemconf
{
	static const char* SYSTEM_CONFIG_FILE = "config/system.conf";
	static const char* INTRO_LIST_FILE = "config/intro_movies.list";
	static const char* KEY_DATABASE_FILE = "config/key_database.list";
	static const char* LANGUAGES_LIST_FILE = "config/languages.conf";
	static const char* LEVEL_LIST_FILE = "config/levels.conf";
	static const char* WATCHED_COMMADS_FILE = "config/watched_commands.list";
	static const char* TEXTURES_LIST_FILE = "config/textures.list";
	static const char* FONTS_LIST_FILE = "config/fonts.list";
	static const char* HIGHSCORE_DATA_FILE = "highscore.dat";
	
	const int INTRO_FLAGS = SDL_HWSURFACE;
	const int BASIC_FLAGS = SDL_OPENGL|SDL_HWSURFACE;
	const int REQUIRED_FLAGS =  SDL_OPENGL|SDL_HWSURFACE|SDL_FULLSCREEN;

	const Uint32 SUBSYSTEMS = SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_TIMER;

	const std::string SYSTEM_WINDOW_TITLE = "Chronophobia v2.0.1 beta";

	//zakladni nastaveni
	const int DEFAULT_RESOLUTION_WIDTH = 640;
	const int DEFAULT_RESOLUTION_HEIGHT = 480;
	const int DEFAULT_BPP = 16;
	const std::string DEFAULT_LANGUAGE = "ENG";
	const int DEFAULT_SKIPINTRO = 0;
	const int DEFAULT_WINDOWEDMODE = 0;
	const int DEFAULT_DEVELOPER = 0;
	static const char* DEFAULT_MENUMAP = "menu.map";

	const int MINIMUM_WIDTH = 640;
	
	//nazvy parametru v konfiguracnim souboru
	const std::string COMMAND_RESOLUTION_WIDTH = "resolutionwidth";
	const std::string COMMAND_RESOLUTION_HEIGHT = "resolutionheight";
	const std::string COMMAND_BPP = "bpp";
	const std::string COMMAND_LANGUAGE = "language";
	const std::string COMMAND_SKIPINTRO = "skipintro";
	const std::string COMMANDS_WINDOWEDMODE = "windowed";
	const std::string COMMANDS_DEVELOPER = "developer";
	const std::string COMMANDS_MENUMAP = "menumap";
	const std::string COMMAND_MAP = "map";

	enum system_states
	{
		SYSTEM_INIT = 0,
		SYSTEM_INTRO
	};


	const int SYSTEM_GL_DOUBLEBUFFER = 1;
	const int SYSTEM_GL_BUFFER_SIZE = 24;
	const int SYSTEM_GL_DEPTH_SIZE = 24;
	const int SYSTEM_GL_STENCIL_SIZE = 0;

	const int SYSTEM_GL_ACCUM_RED_SIZE = 0;
	const int SYSTEM_GL_ACCUM_GREEN_SIZE = 0;
	const int SYSTEM_GL_ACCUM_BLUE_SIZE = 0;
	const int SYSTEM_GL_ACCUM_ALPHA_SIZE = 0;



	//objekt konfigurace
	struct SystemInfo
	{
		int m_iResolutionWidth;
		int m_iResolutionHeight;
		int m_iBpp;
		std::string m_sLanguage;
		int m_iSkipIntro;
		int m_iSystemState;
		int m_iWindowedMode;
		int m_iDeveloper_mode;
		std::string m_sMenuMap;
		SDL_Surface *m_pSystemSurface;
		bool m_bResumeAllowed;
		std::string m_sStartMap;
		std::string m_sGameDirectory;
		SystemInfo();
	};	

	
	//pro inicializaci se pouziva jedna nebo druha z nasledujicich funkci, nikdy obe
	bool init();	//otestuje parametry
	bool loadConfig(  const char* filename );
	void setGameDirectory( std::string gameDir );
	bool initVideo();
	bool initOpenGLSettings();

	//ovladaci funkce
	void parseCommandLine( int argc, char **argv);
	void saveConfig( const char* filename );
	void setParameter( std::string &parameter, std::string &data );
	bool checkAndCorrectParameters();
	SystemInfo &getSystemInfo();
	std::map<int,int> &getVideoModes();
	void requestQuit();
	void quit();
};

#define IFSTREAM_OPEN(obj,file,parms) ifstream obj( (systemconf::getSystemInfo().m_sGameDirectory + file).c_str(), parms);
#define OFSTREAM_OPEN(obj,file,parms) ofstream obj( (systemconf::getSystemInfo().m_sGameDirectory + file).c_str(), parms);
#define FSTREAM_OPEN(obj,file,parms) fstream obj( (systemconf::getSystemInfo().m_sGameDirectory + file).c_str(), parms);

#endif /*SYSTEMCONF_*/

