/**********************************************************************
 * 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 "lastactivitymanager.h"
#include <QDomElement>
#include <QXmppClient.h>
#include <interfaces/core/icoreproxy.h>
#include <interfaces/core/ipluginsmanager.h>
#include <interfaces/azoth/ilastactivityprovider.h>
#include "core.h"

namespace LeechCraft
{
namespace Azoth
{
namespace Xoox
{
	const QString NsLastActivity = "jabber:iq:last";

	QStringList LastActivityManager::discoveryFeatures () const
	{
		return { NsLastActivity };
	}

	bool LastActivityManager::handleStanza (const QDomElement& elem)
	{
		if (elem.tagName () != "iq")
				return false;

		const auto& query = elem.firstChildElement ("query");
		if (query.namespaceURI () != NsLastActivity)
			return false;

		const auto& from = elem.attribute ("from");

		if (elem.attribute ("type") == "get")
		{
			const auto pMgr = Core::Instance ().GetProxy ()->GetPluginsManager ();
			const auto prov = pMgr->GetAllCastableTo<ILastActivityProvider*> ().value (0);

			if (!prov)
				return false;

			auto iq = CreateIq (from, std::max (prov->GetInactiveSeconds (), 0));
			iq.setType (QXmppIq::Result);
			iq.setId (elem.attribute ("id"));

			client ()->sendPacket (iq);
		}
		else if (elem.attribute ("type") == "result" &&
				query.hasAttribute ("seconds"))
			emit gotLastActivity (from, query.attribute ("seconds").toInt ());

		return true;
	}

	QString LastActivityManager::RequestLastActivity (const QString& jid)
	{
		auto iq = CreateIq (jid);
		iq.setType (QXmppIq::Get);
		client ()->sendPacket (iq);

		return iq.id ();
	}

	QXmppIq LastActivityManager::CreateIq (const QString& to, int secs)
	{
		QXmppIq iq;
		iq.setTo (to);

		QXmppElement queryElem;
		queryElem.setTagName ("query");
		queryElem.setAttribute ("xmlns", NsLastActivity);
		if (secs != -1)
			queryElem.setAttribute ("seconds", QString::number (secs));
		iq.setExtensions ({ queryElem });

		return iq;
	}
}
}
}
