//
// C++ Implementation: cdisplaytemplatemgr
//
// Description:
//
//
// Author: The BibleTime team <info@bibletime.info>, (C) 2004
//
// Copyright: See COPYING file that comes with this distribution
//
//

//BibleTime includes
#include "cdisplaytemplatemgr.h"
#include "cswordmoduleinfo.h"
#include "clanguagemgr.h"

#include "frontend/cbtconfig.h"

#include "util/cpointers.h"

#include "config.h"

//TQt includes
#include <tqstringlist.h>
#include <tqfile.h>
#include <tqfileinfo.h>

//KDE includes
#include <tdelocale.h>
#include <kstandarddirs.h>

#include <iostream>

CDisplayTemplateMgr::CDisplayTemplateMgr() {
	init();
	loadUserTemplates();
}

CDisplayTemplateMgr::~CDisplayTemplateMgr() {}


/*!
    \fn CDisplayTemplateMgr::fillTemplate( const TQString& name, const TQString& title, const TQString& content )
 */
const TQString CDisplayTemplateMgr::fillTemplate( const TQString& name, const TQString& content, Settings& settings ) {
	const TQString templateName = m_templateMap.contains(name) ? name : defaultTemplate();

	TQString displayTypeString;

	if (!settings.pageCSS_ID.isEmpty()) {
		displayTypeString = settings.pageCSS_ID;
	}
	else {
		if (settings.modules.count()) {
			switch (settings.modules.first()->type()) {

				case CSwordModuleInfo::Bible:
				displayTypeString = "bible";
				break;

				case CSwordModuleInfo::GenericBook:
				displayTypeString = "book";
				break;

				case CSwordModuleInfo::Commentary:

				case CSwordModuleInfo::Lexicon:

				default:
				displayTypeString = "singleentry";
				break;
			};
		}
		else { //use bible as default type if no modules are set
			displayTypeString = "bible";
		};
	}

	TQString newContent = content;
	const int moduleCount = settings.modules.count();

	if (moduleCount >= 2) {
		//create header for the modules
		TQString header;

		ListCSwordModuleInfo::iterator end_it = settings.modules.end();

		for (ListCSwordModuleInfo::iterator it(settings.modules.begin()); it != end_it; ++it) {
			header.append("<th style=\"width:")
			.append(TQString::number(int( 100.0 / (float)moduleCount )))
			.append("%;\">")
			.append((*it)->name())
			.append("</th>");
		}

		newContent.setLatin1("<table><tr>")
		.append(header)
		.append("</tr>")
		.append(content)
		.append("</table>");
	}

	TQString langCSS;
	CLanguageMgr::LangMap langMap = CPointers::languageMgr()->availableLanguages();

	for ( CLanguageMgr::LangMapIterator it( langMap ); it.current(); ++it ) {
		const CLanguageMgr::Language* lang = it.current();


		//if (lang->isValid() && CBTConfig::get(lang).first) {
		if (!lang->abbrev().isEmpty() && CBTConfig::get(lang).first) {
			const TQFont f = CBTConfig::get(lang).second;

			//don't use important, because it would reset the title formatting, etc. to the setup font
			TQString css("{ ");
			css.append("font-family:").append(f.family())/*.append(" !important")*/;
			css.append("; font-size:").append(TQString::number(f.pointSize())).append("pt /*!important*/");
			css.append("; font-weight:").append(f.bold() ? "bold" : "normal /*!important*/");
			css.append("; font-style:").append(f.italic() ? "italic" : "normal /*!important*/");
			css.append("; }\n");

			langCSS +=
				TQString("\n*[lang=%1] %2")
				.arg(lang->abbrev())
				.arg(css);
		}
	}

	//at first append the font standard settings for all languages without configured font
	CLanguageMgr::LangMapIterator it( langMap );

	const CLanguageMgr::Language* lang = it.current();

	if (lang && !lang->abbrev().isEmpty()/*&& lang->isValid()*/) {
		const TQFont standardFont = CBTConfig::getDefault(lang); //we just need a dummy lang param
		langCSS.prepend(
			TQString("\n#content {font-family:%1; font-size:%2pt; font-weight:%3; font-style: %4;}\n")
			.arg(standardFont.family())
			.arg(standardFont.pointSize())
			.arg(standardFont.bold() ? "bold" : "normal")
			.arg(standardFont.italic() ? "italic" : "normal")
		);
	}

// 	tqWarning("Outputing unformated text");
	const TQString t = TQString(m_templateMap[ templateName ]) //don't change the map's content directly, use  a copy
	 		.replace("#TITLE#", settings.title)
	 		.replace("#LANG_ABBREV#", settings.langAbbrev.isEmpty() ? TQString("en") : settings.langAbbrev)
	 		.replace("#DISPLAYTYPE#", displayTypeString)
	 		.replace("#LANG_CSS#", langCSS)
	 		.replace("#PAGE_DIRECTION#", settings.pageDirection)
	 		.replace("#CONTENT#", newContent);
 	 //printf("%s\n\n", t.latin1());

	return t;
/*			TQString(m_templateMap[ templateName ]) //don't change the map's content directly, use  a copy
		   .replace("#TITLE#", settings.title)
		   .replace("#LANG_ABBREV#", settings.langAbbrev.isEmpty() ? TQString("en") : settings.langAbbrev)
		   .replace("#DISPLAYTYPE#", displayTypeString)
		   .replace("#LANG_CSS#", langCSS)
		   .replace("#PAGE_DIRECTION#", settings.pageDirection)
		   .replace("#CONTENT#", newContent);*/
}


/*!
    \fn CDisplayTemplateMgr::loadUserTemplates
 */
void CDisplayTemplateMgr::loadUserTemplates() {
	tqDebug("Loading user templates");
	TQStringList files = TDEGlobal::dirs()->findAllResources("BT_DisplayTemplates");

	for ( TQStringList::iterator it( files.begin() ); it != files.end(); ++it) {
		tqDebug("Found user template %s", (*it).latin1());

		TQFile f( *it );
		Q_ASSERT( f.exists() );

		if (f.open( IO_ReadOnly )) {
			TQString fileContent = TQTextStream( &f ).read();

			if (!fileContent.isEmpty()) {
				m_templateMap[ TQFileInfo(*it).fileName() + TQString(" ") + i18n("(user template)")] = fileContent;
			}
		}
	}
}

//Include the HTML templates which were put into a cpp file by a Perl script
#include "../display-templates/template-init.cpp"
