<?php
/**
 * @package   FOF
 * @copyright Copyright (c)2010-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

namespace FOF40\Render;

defined('_JEXEC') || die;

use FOF40\Container\Container;

/**
 * Renderer class for use with Akeeba FEF
 *
 * Renderer options
 *
 * wrapper_id           The ID of the wrapper DIV. Default: akeeba-rendered-fef
 * linkbar_style        Style for linkbars: joomla3|classic. Default: joomla3
 * load_fef             Load FEF CSS? Set to false if you are loading it outside the renderer. Default: true
 * load_fef_js          Load FEF JS? Set to false if you are loading it outside the rendered. Default: true
 * load_fef_js_minimal  Load the minimal FEF JS (without features depending on FEF CSS)? Default: inverse of load_fef
 * fef_reset            Should I reset the CSS styling for basic HTML elements inside the FEF container? Default: true
 * fef_dark             Should I load the FEF Dark Mode CSS and supporting JS? Default: 0 (no). Options: 1 (yes and
 *                      activate immediately), -1 (include dark.css but not enable by default, also enables auto mode
 *                      for Safari)
 * custom_css           Comma-separated list of custom CSS files to load _after_ the main FEF CSS file, e.g.
 *                      media://com_foo/css/bar.min.css,media://com_foo/css/baz.min.css
 * remove_wrapper_classes  Comma-separated list of classes to REMOVE from the container
 * add_wrapper_classes     Comma-separated list of classes to ADD to the container
 *
 * Note: when Dark Mode is enabled the class akeeba-renderer-fef--dark is applied to the container DIV. You can use
 * remove_wrapper_classes to remove it e.g. when you want it to be enabled only through a JavaScript-powered toggle.
 *
 * @package FOF40\Render
 */
class FEF extends Joomla
{
	public function __construct(Container $container)
	{
		parent::__construct($container);

		$helperFile = JPATH_SITE . '/media/fef/fef.php';

		if (!class_exists('AkeebaFEFHelper') && is_file($helperFile))
		{
			include_once $helperFile;
		}

		$this->priority = 20;
		$this->enabled  = class_exists('AkeebaFEFHelper');
	}

	public function initialise(string $view, string $task): void
	{
		$useReset    = $this->getOption('fef_reset', 1);
		$useFefCss   = $this->getOption('load_fef', 1);
		$useFefJs    = $this->getOption('load_fef_js', 1);
		$minimalJs   = $this->getOption('load_fef_js_minimal', $useFefCss ? 0 : 1);
		$useDarkMode = $this->getOption('fef_dark', 0);

		if (class_exists('AkeebaFEFHelper'))
		{
			if ($useFefCss)
			{
				\AkeebaFEFHelper::loadCSSFramework((bool) $useReset, (bool) $useDarkMode != 0);
			}

			if ($useFefJs)
			{
				\AkeebaFEFHelper::loadJSFramework((bool) $minimalJs);
			}
		}

		// Unlike the Joomla renderer we do NOT load jQuery unless explicitly enabled
		$loadJQuery = $this->getOption('load_jquery', false);
		$this->setOption('load_jquery', $loadJQuery ? 1 : 0);

		parent::initialise($view, $task);
	}

	/**
	 * Opens the FEF styling wrapper element. Our component's output will be inside this wrapper.
	 *
	 * @param   array  $classes  An array of additional CSS classes to add to the outer page wrapper element.
	 *
	 * @return  void
	 */
	protected function openPageWrapper(array $classes): void
	{
		$useDarkMode = $this->getOption('fef_dark', false);

		if (($useDarkMode == 1) && !in_array('akeeba-renderer-fef--dark', $classes))
		{
			$classes[] = 'akeeba-renderer-fef--dark';
		}

		/**
		 * Remove wrapper classes. By default these are classes for the Joomla 3 sidebar which is not used in FEF
		 * components anymore.
		 */
		$removeClasses = $this->getOption('remove_wrapper_classes', [
			'j-toggle-main',
			'j-toggle-transition',
			'row-fluid',
		]);

		if (!is_array($removeClasses))
		{
			$removeClasses = explode(',', $removeClasses);
		}

		$removeClasses = array_map('trim', $removeClasses);

		foreach ($removeClasses as $class)
		{
			$x = array_search($class, $classes);

			if ($x !== false)
			{
				unset($classes[$x]);
			}
		}

		// Add the following classes to the wrapper div
		$addClasses = $this->getOption('add_wrapper_classes', '');

		if (!is_array($addClasses))
		{
			$addClasses = explode(',', $addClasses);
		}

		$addClasses    = array_map('trim', $addClasses);
		$customClasses = implode(' ', array_unique(array_merge($classes, $addClasses)));

		$id = $this->getOption('wrapper_id', 'akeeba-renderer-fef');
		$id = empty($id) ? "" : sprintf(' id="%s"', $id);

		echo <<< HTML
<div id="akeeba-renderer-fef" class="akeeba-renderer-fef $customClasses"$id>

HTML;
	}

	/**
	 * Close the FEF styling wrapper element.
	 *
	 * @return  void
	 */
	protected function closePageWrapper(): void
	{
		echo <<< HTML
</div>

HTML;

	}
}
