/**********************************************************************
	 *
 * LeechCraft - modular cross-platform feature rich internet client.
 * Copyright (C) 2006-2014  Georg Rudoy
 *
 * Boost Software License - Version 1.0 - August 17th, 2003
 *
 * Permission is hereby granted, free of charge, to any person or organization
 * obtaining a copy of the software and accompanying documentation covered by
 * this license (the "Software") to use, reproduce, display, distribute,
 * execute, and transmit the Software, and to prepare derivative works of the
 * Software, and to permit third-parties to whom the Software is furnished to
 * do so, all subject to the following:
 *
 * The copyright notices in the Software and this entire statement, including
 * the above license grant, this restriction and the following disclaimer,
 * must be included in all copies of the Software, in whole or in part, and
 * all derivative works of the Software, unless such copies or derivative
 * works are solely in the form of machine-executable object code generated by
 * a source language processor.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
 * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
 * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 **********************************************************************/

#pragma once

#include <QString>
#include <QPair>
#include <vmime/mailbox.hpp>
#include <vmime/charsetConverter.hpp>
#include <vmime/utility/outputStreamStringAdapter.hpp>
#include "address.h"

class QIcon;
class QSslCertificate;

namespace vmime
{
class header;

namespace net
{
	class folder;
	class messageSet;
}
namespace security::cert
{
	class certificate;
}
}

namespace LC
{
namespace Snails
{
	enum class FolderType;

	template<typename T>
	QString Stringize (const T& t, const vmime::charset& source)
	{
		vmime::string stringized;
		vmime::utility::outputStreamStringAdapter out (stringized);
		t->extract (out);
		out.flush ();

		const auto& converter = vmime::charsetConverter::create (source, vmime::charsets::UTF_8);
		vmime::string outStr;
		converter->convert (stringized, outStr);

		return QString::fromUtf8 (outStr.c_str ());
	}

	template<typename T>
	QString Stringize (const T& t)
	{
		vmime::string str;
		vmime::utility::outputStreamStringAdapter out (str);

		t->extract (out);

		return QString::fromUtf8 (str.c_str ());
	}

	template<typename T>
	QString StringizeCT (const T& w)
	{
		return QString::fromUtf8 (w.getConvertedText (vmime::charsets::UTF_8).c_str ());
	}

	inline Address Mailbox2Strings (const vmime::shared_ptr<const vmime::mailbox>& mbox)
	{
		if (!mbox)
			return {};

		return
		{
			StringizeCT (mbox->getName ()),
			QString::fromUtf8 (mbox->getEmail ().toString ().c_str ())
		};
	}

	QStringList GetFolderPath (const vmime::shared_ptr<vmime::net::folder>&);
	vmime::net::messageSet ToMessageSet (const QList<QByteArray>&);

	QString GetFolderIconName (FolderType);
	QIcon GetFolderIcon (FolderType);

	QList<QSslCertificate> ToSslCerts (const vmime::shared_ptr<const vmime::security::cert::certificate>&);

	QByteArray SerializeHeader (const vmime::shared_ptr<const vmime::header>&);
}
}
