/**********************************************************************
 * 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 "authmanager.h"
#include <algorithm>
#include <QTimer>
#include "singleaccauth.h"

namespace LeechCraft
{
namespace Scroblibre
{
	AuthManager::AuthManager (ICoreProxy_ptr proxy, QObject *parent)
	: QObject { parent }
	, Proxy_ { proxy }
	, SubmitTimer_ { new QTimer (this) }
	{
		SubmitTimer_->setSingleShot (true);
		connect (SubmitTimer_,
				SIGNAL (timeout ()),
				this,
				SLOT (submit ()));
	}

	void AuthManager::HandleAudio (const Media::AudioInfo& info)
	{
		HandleStopped ();

		if (info.Length_ && info.Length_ < 30)
			return;

		if (info.Length_)
			SubmitTimer_->start (std::min (240, info.Length_ / 2) * 1000);
		LastSubmit_ = info;

		for (const auto& subhash : AccAuths_)
			for (const auto auth : subhash)
				auth->SetNP (LastSubmit_);
	}

	void AuthManager::HandleStopped ()
	{
		SubmitTimer_->stop ();
		if (!LastSubmit_.IsValid ())
			return;

		const int secsTo = LastSubmit_.TS_.secsTo (QDateTime::currentDateTime ());
		if (!LastSubmit_.Info_.Length_ && secsTo > 30)
		{
			LastSubmit_.Info_.Length_ = secsTo;
			submit ();
		}
	}

	void AuthManager::handleAccountAdded (const QUrl& service, const QString& login)
	{
		AccAuths_ [service] [login] = new SingleAccAuth (service, login, Proxy_, this);
	}

	void AuthManager::handleAccountRemoved (const QUrl& service, const QString& login)
	{
		delete AccAuths_ [service].take (login);
	}

	void AuthManager::submit ()
	{
		for (const auto& subhash : AccAuths_)
			for (const auto auth : subhash)
				auth->Submit (LastSubmit_);
	}
}
}
