#include "Common.h"
#include "ConfigDatabase.h"


namespace
{
	const char *SPEAK        = "speak_config";
	const char *ACTIVE_FLAGS = "active_flags";
	const char *ACTIVE_STATE = "active_state";
	const char *ACTIVE_MSG   = "active_msg";
	const char *WELCOME_MSG  = "welcome_msg";
	const char *ENGINE       = "engine";
	const char *VOICE        = "voice";
	const char *VOLUME       = "volume";
	const char *RATE         = "rate";
	const char *PITCH        = "pitch";
}

ConfigDatabase::ConfigDatabase() : m_voice_desc(), m_active_flags(0), m_welcome_msg(L""), m_active_users()
{	
	// load the database from miranda
	load();
}


ConfigDatabase::~ConfigDatabase(void)
{
}


bool ConfigDatabase::getActiveFlag(ActiveFlag flag) const
{
	return ((m_active_flags & (1 << flag)) != 0);
}

//------------------------------------------------------------------------------
void ConfigDatabase::setActiveFlag(ActiveFlag flag, bool state)
{ 
	if (state)
	{
		m_active_flags |= (1 << flag);
	}
	else
	{
		m_active_flags &= ~(1 << flag);
	}
}

//------------------------------------------------------------------------------
ConfigDatabase::act ConfigDatabase::getActiveUser(HANDLE user) const
{
	ActiveUsersMap::const_iterator iter = m_active_users.find(user);

	if (iter == m_active_users.end())
	{
		// get the unknown user status
		iter = m_active_users.find(0);
		
		if (iter == m_active_users.end())
		{
			ConfigDatabase::act ret;
			ret.message = false;
			ret.status = false;
			return ret;
		}
	}

	return iter->second;
}

//------------------------------------------------------------------------------
void ConfigDatabase::setActiveUser(HANDLE user, act state)
{
	m_active_users[user].status = state.status;
	m_active_users[user].message = state.message;
}

//------------------------------------------------------------------------------
void ConfigDatabase::load()
{
	m_voice_desc.engine = DBGetContactSettingString(SPEAK, ENGINE, L"");
	m_voice_desc.voice  = DBGetContactSettingString(SPEAK, VOICE, L"");
	m_voice_desc.volume = db_get_dw(NULL, SPEAK, VOLUME, 50);
	m_voice_desc.pitch  = db_get_dw(NULL, SPEAK, PITCH, 50);
	m_voice_desc.rate   = db_get_dw(NULL, SPEAK, RATE, 50);

	m_active_flags = db_get_dw(NULL, SPEAK, ACTIVE_FLAGS, 0xffff);

	m_welcome_msg = DBGetContactSettingString(SPEAK, WELCOME_MSG, L"Welcome to Miranda");

	// iterate through all the users and add them to the list if active
	HANDLE contact = db_find_first();

	while (NULL != contact)
	{
		m_active_users[contact].status = (db_get_b(contact, SPEAK, ACTIVE_STATE, true) != 0);
		m_active_users[contact].message = (db_get_b(contact, SPEAK, ACTIVE_MSG, true) != 0);

		contact = db_find_next(contact); 
	}

	// load unknown users setting
	m_active_users[0].status = (db_get_b(NULL, SPEAK, ACTIVE_STATE, true) != 0);
	m_active_users[0].message = (db_get_b(NULL, SPEAK, ACTIVE_MSG, true) != 0);
}

//------------------------------------------------------------------------------
void ConfigDatabase::save()
{
	db_set_ts(NULL, SPEAK, ENGINE, m_voice_desc.engine.c_str());
	db_set_ts(NULL, SPEAK, VOICE, m_voice_desc.voice.c_str());
	db_set_dw(NULL, SPEAK, VOLUME, m_voice_desc.volume);
	db_set_dw(NULL, SPEAK, PITCH, m_voice_desc.pitch);
	db_set_dw(NULL, SPEAK, RATE, m_voice_desc.rate);

	db_set_dw(NULL, SPEAK, ACTIVE_FLAGS, m_active_flags);

	db_set_ts(NULL, SPEAK, WELCOME_MSG, m_welcome_msg.c_str());

	for (ActiveUsersMap::iterator i = m_active_users.begin(); i != m_active_users.end(); ++i)
	{
		db_set_b(i->first, SPEAK, ACTIVE_STATE, i->second.status);
		db_set_b(i->first, SPEAK, ACTIVE_MSG, i->second.message);
	}

	// notify the subjects that things have changed
	notify();
}

//------------------------------------------------------------------------------
// private:
//------------------------------------------------------------------------------
std::wstring ConfigDatabase::DBGetContactSettingString(const char *szModule, const char *szSetting, const WCHAR *def)
{
	std::wstring ret = def;
	DBVARIANT dbv;
	
	if (!db_get_ts(NULL, szModule, szSetting, &dbv))
	{
		ret = dbv.pwszVal;
	}
	
	return ret;
}

//==============================================================================