/*
 * translationmanager.cpp
 * Copyright (C) 2006  Remko Troncon, Justin Karneges
 *
 * 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 library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 *
 */

#include <QTranslator>
#include <QCoreApplication>
#include <QFile>
#include <QDir>
#include <QLibraryInfo>

#include "translationmanager.h"
#include "applicationinfo.h"
#include "varlist.h"

TranslationManager::TranslationManager()
{
	// Initialize
	currentLanguage_ = "en";
	QString currentLanguageName = QT_TR_NOOP("language_name");

	// The application translator
	translator_ = new QTranslator(0);

	// The qt translator
	qt_translator_ = new QTranslator(0);

	// Self-destruct
	connect(QCoreApplication::instance(),SIGNAL(aboutToQuit()),SLOT(deleteLater()));
}

TranslationManager::~TranslationManager()
{
	QCoreApplication::instance()->removeTranslator(translator_);
	delete translator_;
	translator_ = 0;
	
	QCoreApplication::instance()->removeTranslator(qt_translator_);
	delete qt_translator_;
	qt_translator_ = 0;
}

TranslationManager* TranslationManager::instance() 
{
	if (!instance_) {
		instance_ = new TranslationManager();
	}
	return instance_;
}

const QString& TranslationManager::currentLanguage() const
{
	return currentLanguage_;
}

QString TranslationManager::currentXMLLanguage() const
{
	QString xmllang = currentLanguage_;
	xmllang.replace('_',"-");
	int at_index = xmllang.indexOf('@');
	if (at_index > 0)
		xmllang = xmllang.left(at_index);
	return xmllang;
}

static bool loadQtTranslationHelper(const QString& language, const QString& dir, QTranslator* qt_translator)
{
	return qt_translator->load("qt_" + language, dir);
}

bool TranslationManager::loadQtTranslation(const QString& language)
{
	foreach(QString dir, translationDirs()) {
		if (loadQtTranslationHelper(language, dir, qt_translator_)) {
			return true;
		}
	}

	return loadQtTranslationHelper(language,
	                               QLibraryInfo::location(QLibraryInfo::TranslationsPath),
	                               qt_translator_);
}

void TranslationManager::loadTranslation(const QString& language)
{
	// The default translation
	if(language == "en") {
		currentLanguage_ = language;
		//currentLanguageName_ = "English";
		QCoreApplication::instance()->removeTranslator(translator_);
		QCoreApplication::instance()->removeTranslator(qt_translator_);
		return;
	}
	
	// Try loading the translation file
	foreach(QString dir, translationDirs()) {
		if(!QFile::exists(dir))
			continue;
		if (translator_->load("psi_" + language, dir)) {
			loadQtTranslation(language);

			if (currentLanguage_ == "en") {
				QCoreApplication::instance()->installTranslator(translator_);
				QCoreApplication::instance()->installTranslator(qt_translator_);
			}
			currentLanguage_ = language;
			break;
		}
	}
}

VarList TranslationManager::availableTranslations()
{
	VarList langs;

	// We always support english
	langs.set("en", "English");
	
	// Search the paths
	foreach(QString dirName, translationDirs()) {
		if(!QFile::exists(dirName))
			continue;

		QDir d(dirName);
		foreach(QString str, d.entryList()) {
			// verify that it is a language file
			if(str.left(4) != "psi_")
				continue;
			int n = str.indexOf('.', 4);
			if(n == -1)
				continue;
			if(str.mid(n) != ".qm")
				continue;
			QString lang = str.mid(4, n-4);

			//printf("found [%s], lang=[%s]\n", str.latin1(), lang.latin1());

			// get the language_name
			QString name = QString("[") + str + "]";
			QTranslator t(0);
			if(!t.load(str, dirName))
				continue;

			//Is translate equivalent to the old findMessage? I hope so
			//Qt4 conversion
			QString s = t.translate("@default", "language_name");
			if(!s.isEmpty())
				name = s;

			langs.set(lang, name);
		}
	}
	
	return langs;
}

QStringList TranslationManager::translationDirs() const
{
	QStringList dirs;
	dirs += ".";
	dirs += ApplicationInfo::homeDir(ApplicationInfo::DataLocation);
	dirs += ApplicationInfo::resourcesDir();
	QString subdir = "/translations";
	dirs += "." + subdir;
	dirs += ApplicationInfo::homeDir(ApplicationInfo::DataLocation) + subdir;
	dirs += ApplicationInfo::resourcesDir() + subdir;
	return dirs;
}


TranslationManager* TranslationManager::instance_ = NULL;
