<?php namespace Joomla\Plugin\Button\QuantumManagerButton\Helper;

/**
 * @package    quantummanagerbutton
 * @author     Dmitry Tsymbal <cymbal@delo-design.ru>
 * @copyright  Copyright © 2019 Delo Design & NorrNext. All rights reserved.
 * @license    GNU General Public License version 3 or later; see license.txt
 * @link       https://www.norrnext.com
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;

class ButtonHelper
{


	/**
	 * @var
	 * @since version
	 */
	public static $template;


	public static function loadLang()
	{
		Factory::getLanguage()->load('plg_editors-xtd_quantummanagerbutton', JPATH_ADMINISTRATOR);
	}


	/**
	 *
	 * @return array
	 *
	 * @since version
	 */
	public static function getFieldsForScopes()
	{

		$db        = Factory::getDbo();
		$query     = $db->getQuery(true)
			->select($db->quoteName(array('params')))
			->from('#__extensions')
			->where('element=' . $db->quote('quantummanagerbutton'));
		$extension = $db->setQuery($query)->loadObject();
		$params    = json_decode($extension->params, JSON_OBJECT_AS_ARRAY);

		if (!isset($params['scopes']) || empty($params['scopes']) || count((array) $params['scopes']) === 0)
		{
			$scopes        = self::defaultValues();
			$scopes_custom = [];
		}
		else
		{
			$scopes        = $params['scopes'];
			$scopes_custom = $params['customscopes'] ?? [];
		}

		$output = [];

		foreach ($scopes as $scope)
		{
			$scope                = (array) $scope;
			$output[$scope['id']] = [
				'title'      => $scope['title'],
				'fieldsform' => $scope['fieldsform']
			];
		}

		foreach ($scopes_custom as $scope)
		{
			$scope                = (array) $scope;
			$output[$scope['id']] = [
				'title'      => $scope['title'],
				'fieldsform' => $scope['fieldsform']
			];
		}

		return $output;
	}


	/**
	 *
	 * @return array
	 *
	 * @since version
	 */
	public static function getTemplateListForScopes()
	{
		$db        = Factory::getDbo();
		$query     = $db->getQuery(true)
			->select($db->quoteName(array('params')))
			->from('#__extensions')
			->where('element=' . $db->quote('quantummanagerbutton'));
		$extension = $db->setQuery($query)->loadObject();
		$params    = json_decode($extension->params, JSON_OBJECT_AS_ARRAY);

		if (!isset($params['scopes']) || empty($params['scopes']) || count((array) $params['scopes']) === 0)
		{
			$scopes        = self::defaultValues();
			$scopes_custom = [];
		}
		else
		{
			$scopes        = $params['scopes'];
			$scopes_custom = $params['customscopes'] ?? [];
		}

		foreach ($scopes_custom as $scope)
		{
			$scopes[count($scopes)] = $scope;
		}

		$output = [];

		foreach ($scopes as $scope)
		{
			$scope = (array) $scope;

			$templatelist          = [];
			$templatelistFromScope = $scope['templatelist'];

			if (!is_array($templatelistFromScope))
			{
				$templatelistFromScope = [
					[
						'templatename' => Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_NAME_DEFAULT'),
						'template'     => '<a href="{file}" target="_blank">{name}</a>'
					]
				];
			}

			foreach ($templatelistFromScope as $keyTemplate => $template)
			{
				$templateItem = '';
				if (preg_match("#^\{\{.*?\}\}$#isu", trim($template['template'])))
				{
					$layoutId     = str_replace(['{', '}'], '', $template['template']);
					$templateItem = self::renderLayout($layoutId);
				}
				else
				{
					$templateItem = $template['template'];
				}

				$enablefields = [];
				$matches      = [];
				preg_match_all("#\{(.*?)\}#isu", $templateItem, $matches);

				if (isset($matches[1]))
				{
					foreach ($matches[1] as $findField)
					{
						if (!in_array($findField, $enablefields))
						{
							$enablefields[] = $findField;
						}
					}

				}

				$templatelist[] = [
					'name'         => $template['templatename'],
					'enablefields' => $enablefields,
				];

			}

			$output[$scope['id']] = [
				'title'        => $scope['title'],
				'templatelist' => $templatelist
			];
		}

		return $output;
	}


	/**
	 * @param $layoutId
	 *
	 * @return string
	 *
	 * @throws Exception
	 * @since version
	 */
	public static function renderLayout($layoutId)
	{
		$app = Factory::getApplication();

		if (empty(self::$template))
		{
			$db    = Factory::getDbo();
			$query = $db->getQuery(true);
			$query->select('template')
				->from('#__template_styles as e')
				->where('e.client_id = 0')
				->where('e.home = 1')
				->setLimit(1);
			$db->setQuery($query);
			$template = $db->loadObject();
			if (isset($template->template))
			{
				self::$template = $template->template;
			}
		}

		$layout = new FileLayout($layoutId);
		$layout->addIncludePath([
			JPATH_ROOT . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, ['templates', self::$template, 'layouts', 'plg_quantummanagcontent']),
			JPATH_ROOT . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, ['templates', self::$template, 'html', 'layouts', 'plg_quantummanagcontent']),
			JPATH_ROOT . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, ['templates', self::$template, 'html', 'layouts', 'plg_content_quantummanagercontent']),
			JPATH_ROOT . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, ['templates', self::$template, 'html', 'plg_content_quantummanagercontent']),
			JPATH_ROOT . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, ['templates', self::$template, 'html', 'plg_quantummanagcontent']),
			JPATH_ROOT . DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, ['templates', self::$template, 'html', 'plg_button_quantummanagerbutton']),
		]);

		$output = $layout->render();

		return $output;
	}


	/**
	 *
	 * @return array
	 *
	 * @since version
	 */
	public static function defaultValues()
	{
		$lang = Factory::getLanguage();
		$lang->load('plg_editors-xtd_quantummanagerbutton', JPATH_ADMINISTRATOR);
		$lang->load('com_quantummanager', JPATH_ROOT . '/administrator/components/com_quantummanager');

		return [
			'images' => (object) [
				'id'           => 'images',
				'title'        => Text::_('COM_QUANTUMMANAGER_SCOPE_IMAGES'),
				'templatelist' => [
					'templatelist0' => [
						'templatename'   => Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_NAME_IMAGE'),
						'templatebefore' => '',
						'template'       => '<img src="{file}" alt="{alt}" width="{width}" height="{height}" />',
						'templateafter'  => '',
					]
				],
				'fieldsform'   => [
					'fieldsform0' => [
						'nametemplate' => 'width',
						'name'         => Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_IMAGES_FIELDSFORM_WIDTH_NAME'),
						'default'      => '',
						'type'         => 'number',
					],
					'fieldsform1' => [
						'nametemplate' => 'height',
						'name'         => Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_IMAGES_FIELDSFORM_HEIGHT_NAME'),
						'default'      => '',
						'type'         => 'number',
					],
					'fieldsform3' => [
						'nametemplate' => 'alt',
						'name'         => Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_IMAGES_FIELDSFORM_ALT_NAME'),
						'default'      => '',
						'type'         => 'text',
					]
				]
			],
			'docs'   => (object) [
				'id'           => 'docs',
				'title'        => Text::_('COM_QUANTUMMANAGER_SCOPE_DOCS'),
				'templatelist' => [
					'templatelist0' => [
						'templatename'   => Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_NAME_DOC'),
						'templatebefore' => '',
						'template'       => '<a href="{file}" target="_blank">{name}</a>',
						'templateafter'  => '',
					]
				],
				'fieldsform'   => [
					'fieldsform0' => [
						'nametemplate' => 'name',
						'name'         => Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_DOCS_FIELDSFORM_NAME_NAME'),
						'default'      => Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_IMAGES_FIELDSFORM_DEFAULT_NAME'),
						'type'         => 'text',
					],
				]
			],
			'music'  => (object) [
				'id'           => 'music',
				'title'        => Text::_('COM_QUANTUMMANAGER_SCOPE_MUSIC'),
				'templatelist' => [
					'templatelist0' => [
						'templatename'   => Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_NAME_AUDIO'),
						'templatebefore' => '',
						'template'       => '<audio controls src="{file}"> ' . Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_MUSIC_TEMPLATE_TEXT') . '</audio>',
						'templateafter'  => '',
					]
				],
				'fieldsform'   => '',
			],
			'videos' => (object) [
				'id'           => 'videos',
				'title'        => Text::_('COM_QUANTUMMANAGER_SCOPE_VIDEOS'),
				'templatelist' => [
					'templatelist0' => [
						'templatename'   => Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_NAME_VIDEO'),
						'templatebefore' => '',
						'template'       => '<video src="{file}" autoplay>' . Text::_('PLG_BUTTON_QUANTUMMANAGERBUTTON_SCOPES_VIDEOS_TEMPLATE_TEXT') . '</video>',
						'templateafter'  => '',
					]
				],
				'fieldsform'   => '',
			]
		];
	}


}