/**********************************************************************
 * 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.
 **********************************************************************/

#include "stddatafiltermenucreator.h"
#include <QVariant>
#include <QMenu>
#include <util/sll/slotclosure.h>
#include <interfaces/iinfo.h>
#include <interfaces/idatafilter.h>
#include <interfaces/core/ientitymanager.h>
#include "util.h"

namespace LeechCraft
{
namespace Util
{
	namespace
	{
		template<typename T>
		void AddDatafilterMenuItem (const IDataFilter::FilterVariant& var, QMenu *menu, T actor)
		{
				const auto act = menu->addAction (var.Icon_, var.Name_);
				new Util::SlotClosure<Util::DeleteLaterPolicy>
				{
					[var, actor] () mutable { actor (var); },
					act,
					SIGNAL (triggered ()),
					act
				};
		}
	}

	StdDataFilterMenuCreator::StdDataFilterMenuCreator (const QVariant& dataVar, IEntityManager *em, QMenu *menu)
	: QObject (menu)
	, EntityMgr_ (em)
	{
		auto entity = MakeEntity (dataVar,
				QString (),
				FromUserInitiated | OnlyHandle,
				"x-leechcraft/data-filter-request");
		for (auto plugin : em->GetPossibleHandlers (entity))
		{
			auto ii = qobject_cast<IInfo*> (plugin);
			auto idf = qobject_cast<IDataFilter*> (plugin);
			if (!idf)
				continue;

			const auto& vars = idf->GetFilterVariants ();

			if (vars.isEmpty ())
				continue;

			const auto actor = [this, entity, plugin] (const IDataFilter::FilterVariant& var) mutable
					{
						entity.Additional_ ["DataFilter"] = var.ID_;
						EntityMgr_->HandleEntity (entity, plugin);

						ChosenPlugin_ = qobject_cast<IInfo*> (plugin)->GetUniqueID ();
						ChosenVariant_ = var.ID_;
					};

			if (vars.size () == 1)
				AddDatafilterMenuItem (vars.value (0), menu, actor);
			else
			{
				auto searchMenu = menu->addMenu (ii->GetIcon (), idf->GetFilterVerb ());
				for (const auto& var : vars)
					AddDatafilterMenuItem (var, searchMenu, actor);
			}
		}
	}

	const QByteArray& StdDataFilterMenuCreator::GetChosenPlugin () const
	{
		return ChosenPlugin_;
	}

	const QByteArray& StdDataFilterMenuCreator::GetChosenVariant () const
	{
		return ChosenVariant_;
	}
}
}
