/*********************************************************************//**
*	Key database.
*	Databaze jmen klaves - kazda klavesa ma sve jmeno. Umoznuje
*			zjistovat cislo klavesy podle jmena a naopak. 
*
*	author: Michal Jirous
*	date: 15.7.2008
*	file: key_database.cpp
**********************************************************************/

#include "ctrl_keydatabase.h"
#include "parsing.h"
#include <fstream>
#include <map>

using namespace parsing;
using namespace key_database;
using namespace systemConsole;
using namespace std;

map<int,string> intToStringKeyMap;
map<string, int> stringToIntKeyMap;

//nacteni dat ze souboru
bool key_database::loadDatabase( const char* filename )
{
	console << "Loading key database..." << endline;
	ifstream fin( filename, ios::in );
	if( !fin.is_open() )
	{
		console << "Error: Could not open '" << filename << "' for load key database" << endline;
		return false;
	}

	int key = 0;
	string name;
	while( true )
	{
		fin >> key;		//cislo klavesy
		if( fin.eof() )
			break;
		
		fin >> name;	//jmeno klavesy
		intToStringKeyMap.insert( make_pair( key, name ) );
		stringToIntKeyMap.insert( make_pair( name, key ) );
	}

	console << "Key database was successfuly loaded" << endline;
	fin.close();
	return true;
}

//zjisteni jmena klavesy
string key_database::getKey( int key )
{
	map<int, string>::iterator iter = intToStringKeyMap.find( key );
	if( iter == intToStringKeyMap.end() )
		return "UNKNOWN";

	if( iter->second.length() == 1 && isAlpha(iter->second.at(0) ) )
		iter->second[0] = toUpper( iter->second.at(0) );

	return iter->second;
}

//zjisteni cisla klavesy
int key_database::getKey( string name )
{
	if( name.length() == 1 && isAlpha( name.at(0) ) )
		name = toLower(name.at(0));

	map<string, int>::iterator iter = stringToIntKeyMap.find( name );
	if( iter == stringToIntKeyMap.end() )
		return -1;
	return iter->second;
}

