<?php

namespace ManiaControl\Plugins;

use FML\Controls\Control;
use FML\Controls\Frame;
use FML\Controls\Label;
use FML\Controls\Labels\Label_Button;
use FML\Controls\Labels\Label_Text;
use FML\Controls\Quads\Quad_Icons64x64_1;
use FML\Script\Features\Paging;
use FML\Script\Script;
use ManiaControl\Admin\AuthenticationManager;
use ManiaControl\Callbacks\CallbackListener;
use ManiaControl\Configurators\ConfiguratorMenu;
use ManiaControl\Files\FileUtil;
use ManiaControl\ManiaControl;
use ManiaControl\Manialinks\ManialinkPageAnswerListener;
use ManiaControl\Players\Player;

/**
 * Configurator for enabling and disabling Plugins
 *
 * @author    ManiaControl Team <mail@maniacontrol.com>
 * @copyright 2014 ManiaControl Team
 * @license   http://www.gnu.org/licenses/ GNU General Public License, Version 3
 */
class PluginInstallMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAnswerListener {
	/*
	 * Constants
	 */
	const SETTING_PERMISSION_INSTALL_PLUGINS = 'Install plugins';
	const ACTION_PREFIX_INSTALLPLUGIN        = 'PluginInstallMenu.Install.';

	/**
	 * Create a new plugin menu instance
	 *
	 * @param ManiaControl $maniaControl
	 */
	public function __construct(ManiaControl $maniaControl) {
		$this->maniaControl = $maniaControl;

		$this->maniaControl->authenticationManager->definePermissionLevel(self::SETTING_PERMISSION_INSTALL_PLUGINS, AuthenticationManager::AUTH_LEVEL_SUPERADMIN);
	}

	/**
	 * Get the Menu Title
	 *
	 * @return string
	 */
	public function getTitle() {
		return 'Install Plugins';
	}

	/**
	 * Get the Configurator Menu Frame
	 *
	 * @param float  $width
	 * @param float  $height
	 * @param Script $script
	 * @param Player $player
	 * @return \FML\Controls\Frame
	 */
	public function getMenu($width, $height, Script $script, Player $player) {
		$paging = new Paging();
		$script->addFeature($paging);
		$frame = new Frame();

		// Config
		$pagerSize     = 9.;
		$entryHeight   = 5.;
		$labelTextSize = 2;
		$pageMaxCount  = 10;
		$y             = 0.;
		$pageFrames    = array();

		// Pagers
		$pagerPrev = new Quad_Icons64x64_1();
		$frame->add($pagerPrev);
		$pagerPrev->setPosition($width * 0.39, $height * -0.44, 2);
		$pagerPrev->setSize($pagerSize, $pagerSize);
		$pagerPrev->setSubStyle(Quad_Icons64x64_1::SUBSTYLE_ArrowPrev);

		$pagerNext = new Quad_Icons64x64_1();
		$frame->add($pagerNext);
		$pagerNext->setPosition($width * 0.45, $height * -0.44, 2);
		$pagerNext->setSize($pagerSize, $pagerSize);
		$pagerNext->setSubStyle(Quad_Icons64x64_1::SUBSTYLE_ArrowNext);

		$paging->addButton($pagerNext);
		$paging->addButton($pagerPrev);

		$pageCountLabel = new Label_Text();
		$frame->add($pageCountLabel);
		$pageCountLabel->setHAlign(Control::RIGHT);
		$pageCountLabel->setPosition($width * 0.35, $height * -0.44, 1);
		$pageCountLabel->setStyle($pageCountLabel::STYLE_TextTitle1);
		$pageCountLabel->setTextSize(2);

		$paging->setLabel($pageCountLabel);

		$url        = ManiaControl::URL_WEBSERVICE . 'plugins';
		$dataJson   = FileUtil::loadFile($url);
		$pluginList = json_decode($dataJson);
		$index      = 0;
		if ($pluginList && isset($pluginList[0])) {
			$pluginClasses = $this->maniaControl->pluginManager->getPluginClasses();
			$pluginIds     = array();
			/** @var Plugin $class */
			foreach ($pluginClasses as $class) {
				$pluginIds[] = $class::getId();
			}

			foreach ($pluginList as $plugin) {
				if (!in_array($plugin->id, $pluginIds)) {
					if (!isset($pageFrame)) {
						$pageFrame = new Frame();
						$frame->add($pageFrame);
						if (!empty($pageFrames)) {
							$pageFrame->setVisible(false);
						}

						array_push($pageFrames, $pageFrame);
						$paging->addPage($pageFrame);
						$y = $height * 0.41;
					}

					$pluginFrame = new Frame();
					$pageFrame->add($pluginFrame);
					$pluginFrame->setY($y);

					$nameLabel = new Label_Text();
					$pluginFrame->add($nameLabel);
					$nameLabel->setHAlign(Control::LEFT);
					$nameLabel->setX($width * -0.4);
					$nameLabel->setSize($width * 0.5, $entryHeight);
					$nameLabel->setStyle($nameLabel::STYLE_TextCardSmall);
					$nameLabel->setTextSize($labelTextSize);
					$nameLabel->setText($plugin->name);

					$descriptionLabel = new Label();
					$pageFrame->add($descriptionLabel);
					$descriptionLabel->setAlign(Control::LEFT, Control::TOP);
					$descriptionLabel->setPosition($width * -0.45, $height * -0.22);
					$descriptionLabel->setSize($width * 0.7, $entryHeight);
					$descriptionLabel->setTextSize(2);
					$descriptionLabel->setTranslate(true);
					$descriptionLabel->setVisible(false);
					$descriptionLabel->setAutoNewLine(true);
					$descriptionLabel->setMaxLines(5);
					$description = "Author: {$plugin->author}\nVersion: {$plugin->currentVersion->version}\nDesc: {$plugin->description}";
					$descriptionLabel->setText($description);
					$nameLabel->addTooltipFeature($descriptionLabel);

					$installButton = new Label_Button();
					$pluginFrame->add($installButton);
					$installButton->setHAlign(Control::RIGHT);
					$installButton->setX($width * 0.45);
					$installButton->setStyle($installButton::STYLE_CardButtonSmall);
					$installButton->setTextPrefix('$f00');
					$installButton->setText('Install');
					$installButton->setAction(self::ACTION_PREFIX_INSTALLPLUGIN . $plugin->id);

					$y -= $entryHeight;
					if ($index % $pageMaxCount == $pageMaxCount - 1) {
						unset($pageFrame);
					}

					$index++;
				}
			}
		}

		return $frame;
	}

	/**
	 * Save the Config Data
	 *
	 * @param array  $configData
	 * @param Player $player
	 */
	public function saveConfigData(array $configData, Player $player) {
		// TODO: Implement saveConfigData() method.
	}
}