/* This file is part of the KDE project
   Copyright (C) 2007 Jaroslaw Staniek <js@iidea.pl>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library 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
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
*/

#include "kexitemplateloader.h"

#include <kstandarddirs.h>
#include <tdeglobal.h>
#include <tdelocale.h>
#include <tdeconfig.h>
#include <kdebug.h>
#include <kiconloader.h>
#include <tdeapplication.h>

#include <tqdir.h>

//static
KexiTemplateInfo::List KexiTemplateLoader::loadListInfo()
{
	KexiTemplateInfo::List list;
	const TQString subdir = TQString(kapp->instanceName()) + "/templates";
	TQString lang( TDEGlobal::locale()->language() );
	TQStringList dirs( kapp->dirs()->findDirs("data", subdir) );
	while (true) {
		foreach( TQStringList::ConstIterator, it, dirs) {
			TQDir dir((*it)+lang);
			if (!dir.exists())
				continue;
			if (!dir.isReadable()) {
				kdWarning() << "KexiTemplateLoader::loadListInfo() \"" << dir.absPath() << "\" not readable!" << endl;
				continue;
			}
			const TQStringList templateDirs( dir.entryList(TQDir::Dirs, TQDir::Name) );
			const TQString absDirPath( dir.absPath() + '/' );
			foreach(TQStringList::ConstIterator, templateIt, templateDirs) {
				if ((*templateIt)=="." || (*templateIt==".."))
					continue;
				KexiTemplateInfo info = KexiTemplateLoader::loadInfo( absDirPath + *templateIt );
				if (!info.name.isEmpty())
					list.append( info );	
			}
		}
		if (lang != "en" && list.isEmpty()) //not found for current locale, try "en"
			lang = "en";
		else
			break;
	}
	return list;
}

//static
KexiTemplateInfo KexiTemplateLoader::loadInfo(const TQString& directory)
{
	TQDir dir(directory);
	if (!dir.isReadable()) {
		kdWarning() << "KexiTemplateLoader::loadInfo() \"" 
			<< directory << "\" not readable!" << endl;
		return KexiTemplateInfo();
	}
	if (!TQFileInfo(directory+"/info.txt").isReadable())
		return KexiTemplateInfo();
	TDEConfig infoTxt(directory+"/info.txt", true/*readonly*/, false/*local*/);
	KexiTemplateInfo info;
	info.name = infoTxt.readEntry("Name");
	if (info.name.isEmpty()) {
		kdWarning() << "KexiTemplateLoader::loadInfo() \"" << (directory+"/info.txt") << "\" contains no \"name\" field" << endl;
		return KexiTemplateInfo();
	}
	const TQStringList templateFiles( dir.entryList("*.kexi", TQDir::Files|TQDir::Readable, TQDir::Name) );
	if (templateFiles.isEmpty()) {
		kdWarning() << "KexiTemplateLoader::loadInfo() no readable .kexi template file found in \"" << directory << "\"" << endl;
		return KexiTemplateInfo();
	}
	info.filename = directory+"/"+templateFiles.first();
	info.description = infoTxt.readEntry("Description");
	const TQString iconFileName( infoTxt.readEntry("Icon") );
	if (!iconFileName.isEmpty())
		info.icon = TQPixmap(directory+'/'+iconFileName);
	if (info.icon.isNull())
		info.icon = DesktopIcon("kexiproject_sqlite"); //default
	TQStringList autoopenObjectsString = infoTxt.readListEntry("AutoOpenObjects");
	foreach( TQStringList::ConstIterator, it, autoopenObjectsString) {
		KexiProjectData::ObjectInfo autoopenObject;
		TQStringList autoopenObjectNameSplitted( TQStringList::split(':', *it) );
		if (autoopenObjectNameSplitted.count()>1) {
			autoopenObject["type"] = autoopenObjectNameSplitted[0];
			autoopenObject["name"] = autoopenObjectNameSplitted[1];
		}
		else {
			autoopenObject["type"] = "table";
			autoopenObject["name"] = autoopenObjectNameSplitted[0];
		}
		autoopenObject["action"] = "open";
		info.autoopenObjects.append( autoopenObject );
	}
	return info;
}
