//=============================================================================
//
//   File : libkvisetup.cpp
//   Creation date : Sat Oct  6 02:08:24 2001 GMT by Szymon Stefanek
//
//   This file is part of the KVIrc IRC client distribution
//   Copyright (C) 2001-2010 Szymon Stefanek (pragma at kvirc dot net)
//
//   This program 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 2
//   of the License, or (at your option) any 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.
//
//   You should have received a copy of the GNU General Public License
//   along with this program. If not, write to the Free Software Foundation,
//   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================

#include "SetupWizard.h"

#include "KviModule.h"
#include "KviOptions.h"
#include "kvi_defaults.h"
#include "KviApplication.h"
#include "KviKvsScript.h"
#include "KviKvsVariantList.h"
#include "KviWindow.h"
#include "KviTheme.h"
#include "KviIrcServerDataBase.h"
#include "KviModuleManager.h"

#include <QString>
#include <QFile>

extern KVIRC_API KviModuleManager * g_pModuleManager;

// this will be chosen during the setup process
QString g_szChoosenIncomingDirectory;
int g_iThemeToApply = THEME_APPLY_NONE;
bool bNeedToApplyDefaults;
unsigned int uPort;
QString szHost;
QString szUrl;
QString szMircServers;
QString szMircIni;

// this is called by KviApplication when no local kvirc directory has been found
// we have nothing to rely on yet... (settings have not been loaded yet)
KVIMODULEEXPORTFUNC bool setup_begin()
{
	// FIXME: try to guess the user's .kvirc directory
	//        and the preferred nickname from a previous installation
	SetupWizard * w = new SetupWizard();
	int retcode = w->exec();
	delete w;
	return (retcode == QDialog::Accepted);
}

// this is called just after the first startup
// all the subsystems are up and running (we even have a nice console
// to write on if needed).
// all the options are loaded.
KVIMODULEEXPORTFUNC void setup_finish()
{
	if(bNeedToApplyDefaults)
	{
		KVI_OPTION_STRING(KviOption_stringIncomingPath) = g_szChoosenIncomingDirectory;
		// Reset the quit message and the real name... if they contain the KVIrc version
		// then probably the user hasn't even edited them.
		if(KVI_OPTION_STRING(KviOption_stringQuitMessage).indexOf("KVIrc", 0, Qt::CaseInsensitive) != -1)
			KVI_OPTION_STRING(KviOption_stringQuitMessage) = KVI_DEFAULT_QUIT_MESSAGE;
		// We deserve to change the user's part message in something nice :)
		KVI_OPTION_STRING(KviOption_stringPartMessage) = KVI_DEFAULT_PART_MESSAGE;

		// FIXME: Should we also change these ?
		// #define KVI_DEFAULT_CTCP_USERINFO_REPLY "I'm too lazy to edit this field."
		// #define KVI_DEFAULT_AWAY_MESSAGE "I'm off to see the wizard."

		// Apply the chosen default theme
		KviThemeInfo out;
		switch(g_iThemeToApply)
		{
			case THEME_APPLY_HIRES:
				KviTheme::apply("Aria-2.0.0", KviThemeInfo::Builtin, out);
				break;
			case THEME_APPLY_LORES:
				KviTheme::apply("MinimalDark-2.0.0", KviThemeInfo::Builtin, out);
				break;
				// default: no theme
		}

		if(!szMircServers.isEmpty())
		{
			g_pServerDataBase->importFromMircIni(szMircServers, szMircIni,
			    KVI_OPTION_STRINGLIST(KviOption_stringlistRecentServers));
			g_pApp->saveIrcServerDataBase();
		}

		g_pApp->loadDefaultScript();
		if(!szUrl.isEmpty())
		{
			KviKvsVariantList * pParams = new KviKvsVariantList();
			pParams->append(szUrl);
			KviKvsScript::run("openurl $0", g_pActiveWindow, pParams);
			delete pParams;
			KVI_OPTION_BOOL(KviOption_boolShowServersConnectDialogOnStart) = true;
		}
		else if(!szHost.isEmpty())
		{
			KviKvsVariantList * pParams = new KviKvsVariantList();
			pParams->append(szHost);
			pParams->append((kvs_int_t)uPort);
			KviKvsScript::run("server $0 $1", g_pActiveWindow, pParams);
			delete pParams;
			KVI_OPTION_BOOL(KviOption_boolShowServersConnectDialogOnStart) = true;
		}

		// detect the most appropriate sound system
		KviModule * m = g_pModuleManager->getModule("snd");
		if(m) {
			QString szSoundSystem;
			if (m->ctrl("detectSoundSystem", &szSoundSystem) &&
				!KviQString::equalCI(szSoundSystem, "null"))
			{
				KVI_OPTION_STRING(KviOption_stringSoundSystem) = szSoundSystem;
			}
		}
	}
}

static bool setup_module_init(KviModule *)
{
	bNeedToApplyDefaults = true;
	return true;
}

static bool setup_module_cleanup(KviModule *)
{
	return true;
}

static bool setup_module_can_unload(KviModule *)
{
	return true; // can be always unloaded...this module does basically nothing
}

KVIRC_MODULE(
    "Setup Wizard",
    "4.0.0",
    "Szymon Stefanek <pragma at kvirc dot net>",
    "First-time-run setup wizard",
    setup_module_init,
    setup_module_can_unload,
    0,
    setup_module_cleanup,
    0)
