<?php

/**
 * @package SP Page Builder
 * @author JoomShaper http://www.joomshaper.com
 * @copyright Copyright (c) 2010 - 2023 JoomShaper
 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later
 */

use Joomla\CMS\Factory;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Filesystem\Folder;
use Joomla\CMS\Plugin\PluginHelper;

//no direct access
defined('_JEXEC') or die('Restricted access');

/**
 * Addon Config class.
 * 
 * @since 1.0.0
 */
class SpAddonsConfig
{
	/**
	 * Addons list
	 *
	 * @var array
	 * 
	 * @since 1.0.0
	 */
	public static $addons = array();

	/**
	 * Replace sp_ string form addon name.
	 *
	 * @param string $from		_sp string
	 * @param string $to		'' String
	 * @param string $subject	addon name 
	 * 
	 * @return void
	 * 
	 * @since 1.0.0
	 */
	private static function str_replace_first($from, $to, $subject)
	{
		$from = '/' . preg_quote($from, '/') . '/';

		return preg_replace($from, $to, $subject, 1);
	}

	/**
	 * Generate addon list form addon config array.
	 *
	 * @param array $attributes addon attributes
	 * 
	 * @return array addon list.
	 * 
	 * @since 1.0.0
	 */
	public static function addonConfig($attributes)
	{
		if (empty($attributes['addon_name']) || empty($attributes)) return;

		$addon = self::str_replace_first('sp_', '', $attributes['addon_name']);
		$app = Factory::getApplication();
		$com_option = $app->input->get('option', '', 'STR');
		$com_view = $app->input->get('view', '', 'STR');
		$com_id = $app->input->get('id', 0, 'INT');

		if ($app->isClient('administrator') || ($com_option === 'com_sppagebuilder' && $com_view === 'form' && $com_id))
		{
			if (!isset($attributes['icon']) || !$attributes['icon']) $attributes['icon'] = self::getIcon($addon);
		}

		$addon = self::str_replace_first('sp_', '', $attributes['addon_name']);

		$app = Factory::getApplication();
		$com_option = $app->input->get('option', '', 'STR');
		$com_view = $app->input->get('view', '', 'STR');
		$com_id = $app->input->get('id', 0, 'INT');

		if ($app->isClient('administrator') || ($com_option === 'com_sppagebuilder' && $com_view === 'form' && $com_id))
		{
			if (!isset($attributes['icon']) || !$attributes['icon'])
			{
				$attributes['icon'] = self::getIcon($addon);
			}
		}

		if (isset($attributes['attr']) && is_array($attributes['attr']))
		{
			if (!isset($attributes['attr']['general']))
			{
				foreach ($attributes['attr'] as $key => $attr)
				{
					if (isset($attributes['attr'][$key]) && $attributes['attr'][$key])
					{
						unset($attributes['attr'][$key]);
					}
					$attributes['attr']['general'][$key] = $attr;
				}
			}
		}

		if (isset($attributes['context']) && stripos($attributes['context'], 'easystore') === 0)
		{
			$contextArray = explode('.', $attributes['context']);
			$addon = implode('_', $contextArray) . '_' . $addon;
			$attributes['addon_name'] = $addon;
		}

		self::$addons[$addon] = $attributes;
	}

	/**
	 * Load the addons from the `#__sppagebuilder_addonlist` table.
	 * This table store the status of the addons.
	 *
	 * @return 	array
	 *
	 * @since 	4.0.0
	 */
	public static function loadAddonList(): array
	{
		$db 	= Factory::getDbo();
		$query 	= $db->getQuery(true);
		$query->select('id, name, status, is_favorite')
			->from($db->quoteName('#__sppagebuilder_addonlist'));
		$db->setQuery($query);

		try
		{
			return $db->loadObjectList('name');
		}
		catch (Exception $e)
		{
			return [];
		}

		return [];
	}

	/**
	 * Get active addons list.
	 *
	 * @return array
	 * @since 4.0.0
	 */
	public static function getAddons()
	{
		$addonList = self::loadAddonList();

		if (empty($addonList))
		{
			return self::$addons;
		}

		return array_filter(self::$addons, function ($_addon) use ($addonList)
		{
			$addonName = $_addon['addon_name'] ?? '';

			if (empty($addonName))
			{
				return true;
			}

			if (!isset($addonList[$addonName]))
			{
				return true;
			}

			return $addonList[$addonName]->status == 1;
		});
	}

	/**
	 * Get addon icon
	 *
	 * @param  stdClass $addon
	 * @return string
	 * @since 4.0.0
	 */
	public static function getIcon($addon)
	{
		if (isset($addon->icon))
		{
			return $addon->icon;
		}
		elseif (isset($addon['icon']))
		{
			return $addon['icon'];
		}
		elseif (!empty($addon))
		{
			$template_name = self::getTemplateName();
			$template_path = JPATH_ROOT . '/templates/' . $template_name . '/sppagebuilder/addons/' . $addon . '/assets/images/icon.png';
			$com_file_path = JPATH_ROOT . '/components/com_sppagebuilder/addons/' . $addon . '/assets/images/icon.png';


			$path = JPATH_PLUGINS . '/sppagebuilder';
			$plg_file_path = '';
			$plg_icon_path = '';

			if (Folder::exists($path))
			{
				$plugins = Folder::folders($path);

				if (count((array) $plugins))
				{
					foreach ($plugins as $plugin)
					{
						if (PluginHelper::isEnabled('sppagebuilder', $plugin))
						{
							if (Folder::exists(JPATH_PLUGINS . '/sppagebuilder/' . $plugin . '/addons/' . $addon))
							{
								$plg_icon_path = JPATH_PLUGINS . '/sppagebuilder/' . $plugin . '/addons/' . $addon . '/assets/images/icon.png';

								if (file_exists($plg_icon_path))
								{
									$plg_file_path = Uri::root(TRUE)  . '/plugins/sppagebuilder/' . $plugin . '/addons/' . $addon . '/assets/images/icon.png';
								}
							}
						}
					}
				}
			}

			if (file_exists($template_path))
			{
				$icon = Uri::root(true) . '/templates/' . $template_name . '/sppagebuilder/addons/' . $addon . '/assets/images/icon.png';
			}
			elseif (file_exists($com_file_path))
			{
				$icon = Uri::root(true) . '/components/com_sppagebuilder/addons/' . $addon . '/assets/images/icon.png';
			}
			elseif (!empty($plg_icon_path) && file_exists($plg_icon_path))
			{
				$icon = $plg_file_path;
			}
			else
			{
				$icon = Uri::root(true) . '/administrator/components/com_sppagebuilder/assets/img/addon-default.png';
			}

			return '<img src="' . $icon . '"/>';
		}
	}

	/**
	 * Get Current Template
	 *
	 * @return void
	 * @since 4.0.0
	 */
	private static function getTemplateName()
	{
		$db = Factory::getDbo();
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array('template')));
		$query->from($db->quoteName('#__template_styles'));
		$query->where($db->quoteName('client_id') . ' = 0');
		$query->where($db->quoteName('home') . ' = 1');
		$db->setQuery($query);

		return $db->loadObject()->template;
	}
}
