/**********************************************************************
 * 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 "speedselectoraction.h"
#include <functional>
#include <QComboBox>
#include <QSettings>
#include <QTimer>
#include <QCoreApplication>
#include "xmlsettingsmanager.h"
#include "core.h"

namespace LeechCraft
{
	namespace Plugins
	{
		namespace BitTorrent
		{
			SpeedSelectorAction::SpeedSelectorAction (const QString& s, QObject *parent)
			: QWidgetAction (parent)
			, Setting_ (s)
			{
			}

			int SpeedSelectorAction::CurrentData ()
			{
				QList<QWidget*> ws = createdWidgets ();
				if (ws.size ())
				{
					QComboBox *bx = static_cast<QComboBox*> (ws.at (0));
					return bx->itemData (bx->currentIndex ()).toInt ();
				}
				else
					return 0;
			}

			QWidget* SpeedSelectorAction::createWidget (QWidget *parent)
			{
				QComboBox *selector = new QComboBox (parent);
				connect (selector,
						SIGNAL (currentIndexChanged (int)),
						this,
						SLOT (syncSpeeds (int)));

				QTimer::singleShot (0,
						this,
						SLOT (handleSpeedsChanged ()));

				return selector;
			}

			void SpeedSelectorAction::deleteWidget (QWidget *w)
			{
				delete w;
			}

			void SpeedSelectorAction::handleSpeedsChanged ()
			{
				Call ([] (QComboBox *box) { box->clear (); });

				if (!XmlSettingsManager::Instance ()->
						property ("EnableFastSpeedControl").toBool ())
				{
					setVisible (false);
					return;
				}

				QSettings settings (QCoreApplication::organizationName (),
						QCoreApplication::applicationName () + "_Torrent");
				settings.beginGroup ("FastSpeedControl");
				int num = settings.beginReadArray ("Values");
				for (int i = 0; i < num; ++i)
				{
					settings.setArrayIndex (i);
					int dv = settings.value (Setting_ + "Value").toInt ();
					const auto& str = tr ("%1 KiB/s").arg (dv);
					Call ([dv, str] (QComboBox *box) { box->addItem (str, dv); });
				}
				settings.endArray ();
				settings.endGroup ();

				Call ([] (QComboBox *box) { box->addItem (QString::fromUtf8 ("\u221E"), 0); });
				Call ([] (QComboBox *box) { box->setCurrentIndex (box->count () - 1); });

				setVisible (true);
			}

			void SpeedSelectorAction::syncSpeeds (int s)
			{
				Call ([s] (QComboBox *box) { box->setCurrentIndex (s); });
				emit currentIndexChanged (s);
			}
		};
	};
};

