/*********************************************************************
*	textLibrary
*	SOURCE FILE
*	Autor:	Michal Jirouš
*	Datum: 21.7.2008
*	Soubor: textLibrary.cpp
*	Popis: Modul nacita dle configuracniho souboru jazykovy balicek, ktery
*			obsahuje texty vybraneho jazyka.
**********************************************************************/

#include "textLibrary.h"
#include <fstream>
#include <iostream>
#include "parsing.h"
#include "sys_console.h"

using namespace systemConsole;
using namespace std;
using namespace textLibrary;

std::map<unsigned int, std::string> mapOfTexts;
std::map<string,Language> languageList;

bool loadLanguageData( std:: string filename );

string g_CurrentLanguage;

bool textLibrary::init( std::string configFile, std::string sLanguageKey )
{
	g_CurrentLanguage = sLanguageKey;
	console << "Initializing texts library..." << endline;
	std::ifstream fin( configFile.c_str() );

	if( !fin.is_open() )
	{
		console << "Languages config file '" << configFile << "' was not found." << endline;
		return false;
	}
	
	console << "->Configuration file '" << configFile << "' has been found, reading started." << endline;
	
	Language newLang;
	string sReadedText;
	
	while( fin >> sReadedText )
	{
		if( fin.eof() )
			break;
		
		if( !sReadedText.empty() && sReadedText.at(0) == '#' )	//je to komentar
			while( fin.get() != '\n' && !fin.eof() );
		else
		{
			newLang.m_sLanguage = parsing::readPosibleQuotedData( fin );
			newLang.m_sFilename = parsing::readPosibleQuotedData( fin );	//filename
			languageList.insert( make_pair( sReadedText, newLang ) );

			//if( sReadedText == sLanguageKey ) //nalezen klic k jazyku
			//{
			//	cout << "->Language key '" << sLanguageKey << "' has been founded." << endl;
			//	sReadedText = readTillEndOfLine( fin );	//filename
			//	if( sReadedText.empty() || fin.eof() )
			//		cerr << "Wrong language key filename, searching for other record with key '" << sLanguageKey << "'." << endl;
			//	else
			//	{
			//		cout << "->Preparing language texts loading." << endl;
			//		
			//		if(  loadLanguageData( sReadedText ) )
			//		{
			//			fin.close();
			//			cerr << "Initializing is done." << endl;
			//			return true;
			//		}
			//		else
			//			cerr << "Error while loading language data, searching for other record with key '" << sLanguageKey << "'." << endl;
			//	}
			//	
			//}
			//else
			//	while( fin.get() != '\n' && !fin.eof() );
			
		}
		
	}
	fin.close();

	map<string,Language>::iterator iter = languageList.find( sLanguageKey );
	if( iter == languageList.end() )
	{
		console << "Language data for key '" << sLanguageKey << "' could not be loaded." << endline;
		console << "Initializing failed." << endline;
		return false;
	}

	if( loadLanguageData( iter->second.m_sFilename ) )
	{
		console << "Initializing is done." << endline;
		return true;
	}
	else
	{
		console << "Error while loading language data with key '" << sLanguageKey << "'." << endline;
		return false;
	}
	
}

bool loadLanguageData( std:: string filename )
{
	if( filename.empty() )
		return false;
	//odstrani jedny uvozovky na zacatku a na konci, pokud tam jsou
	//leaveQuotes( filename );	
	
	ifstream fin( filename.c_str() );
	if( !fin.is_open() )
	{
		console << "Language data file '" << filename << "' was not found." << endline;
		return false;
	}	

	console << "->Reading language data file '" << filename << "'." << endline;
	string sReadedText;
	unsigned int key = 0;
	while( fin >> sReadedText )
	{
		if( fin.eof() )
			break;
		
		if( !sReadedText.empty() && sReadedText.at(0) == '#' )	//je to komentar
			while( fin.get() != '\n' && !fin.eof() );
		else
		{
			key = atoi( sReadedText.c_str() );
			sReadedText = parsing::readPosibleQuotedData( fin );
				
			//odstrani jedny uvozovky na zacatku a na konci, pokud tam jsou
			//leaveQuotes( sReadedText );	
				
			
			mapOfTexts.insert( make_pair( key, sReadedText) );
			console << "->Record ( " << key << ", '" << sReadedText << "' )  was added to database." << endline;
		}

	}
	
	
	fin.close();
	console << "->Loading was successfully done." << endline;
	return true;
}


std::map<std::string, Language> &textLibrary::getLanguageMap()
{
	return languageList;
}

void textLibrary::leaveQuotes( std::string &str )
{
	if( str.size() > 1 && str.at(0) == '"' )
	{
		str.resize( str.size() - 1);
		str = str.substr(1);
	}
}


std::string textLibrary::getText( unsigned int key )
{
	map<unsigned int, std::string>::iterator iter = mapOfTexts.find( key );
	if( iter == mapOfTexts.end())
		return string();
	return iter->second;
}



map<unsigned, string> g_LevelTextsMap;


void textLibrary::setLevelTexts( std::string text_stream )
{
	g_LevelTextsMap.clear();
	istringstream in( text_stream );

	string lang = "general";

	string data;
	unsigned key = 0;
	while( in >> data )	//EOF
	{
		if( in.eof() )
			break;

		if( lang != "general" && lang != g_CurrentLanguage )
		{
			parsing::readField( in, '$' );
			lang = parsing::readPosibleQuotedData( in );
		}
		else if( !data.empty() && data.at(0) == '$' )
		{
			lang = data.substr( 1, data.length() );
		}
		else
		{
			if( lang == "general" || lang == g_CurrentLanguage )
			{
				key = atoi( data.c_str() );
				data = parsing::readPosibleQuotedData( in );

				if( !data.empty() )
					g_LevelTextsMap.insert( make_pair( key, data ) );
			}
		
		
		}
	
	}




}

std::string textLibrary::getLevelText( unsigned int key )
{
	map<unsigned, std::string>::iterator iter = g_LevelTextsMap.find( key );
	if( iter == g_LevelTextsMap.end())
		return string();
	return iter->second;
}
