<?php
/**
 * @package    Joomla.Component.Builder
 *
 * @created    30th April, 2015
 * @author     Llewellyn van der Merwe <https://dev.vdm.io>
 * @git        Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
 * @copyright  Copyright (C) 2015 Vast Development Method. All rights reserved.
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;
use Joomla\Database\DatabaseInterface;

/**
 * Script File of Componentbuilder Package
 */
class pkg_component_builderInstallerScript
{
	/**
	 * Called after any type of action
	 *
	 * @return  boolean  True on success
	 */
	public function postflight($type, $parent)
	{
		// enable the JCB plugins
		$this->enableJCBPlugins();

		// only run these if we have an update
		if ('update' == $type)
		{
			// update the update server location
			$this->updateServerLocation();
		}
	}

	/**
	 * Update server location
	 *
	 * @return  void
	 */
	protected function updateServerLocation()
	{
		$location = "https://raw.githubusercontent.com/joomengine/Joomla-Component-Builder/refs/heads/5.x/componentbuilder_update_server.xml";
		$elements = ['pkg_component_builder', 'pkg_componentbuilder', 'com_componentbuilder'];
		$db = Factory::getContainer()->get(DatabaseInterface::class);

		// Get the Package Update Site Details
		foreach ($elements as $element)
		{
			if (($sites = $this->getUpdateSites($element, $db)) !== null)
			{
				foreach ($sites as $site)
				{
					if ($site->location !== $location)
					{
						// Update the update site location
						$site->location = $location;
						$db->updateObject('#__update_sites', $site, 'update_site_id');
					}
				}
			}
		}
	}

	/**
	 * Get Update Sites
	 *
	 * @return  array|null
	 */
	protected function getUpdateSites(string $element, DatabaseInterface $db): ?array
	{
		// Get the Package Update Site Details
		$query = $db->getQuery(true);
		$query->select($db->quoteName(array('s.location', 's.update_site_id')));
		$query->from($db->quoteName('#__update_sites', 's'));
		$query->join('LEFT', $db->quoteName('#__update_sites_extensions', 'u') . ' ON ' . $db->quoteName('s.update_site_id') . ' = ' . $db->quoteName('u.update_site_id'));
		$query->join('LEFT', $db->quoteName('#__extensions', 'e') . ' ON ' . $db->quoteName('u.extension_id') . ' = ' . $db->quoteName('e.extension_id'));
		$query->where($db->quoteName('e.element') . ' = ' . $db->quote($element));
		$db->setQuery($query);
		$db->execute();

		if ($db->getNumRows())
		{
			return $db->loadObjectList();
		}
		return null;
	}

	/**
	 * Enable all JCB Plugins
	 *
	 * @return  void
	 */
	protected function enableJCBPlugins()
	{
		// Get The Database object
		$db = Factory::getContainer()->get(DatabaseInterface::class);
		// enable all JCB plugins Always!
		$plugins = [
			'componentbuilderadminheaderstabs',
			'componentbuildercomponentdashboardheaderstabs',
			'componentbuildercomponentheaderstabs',
			'componentbuildercustomadminheaderstabs',
			'componentbuilderlanguagetabs',
			'componentbuildersiteheaderstabs',
			'componentbuilderdynamicgetheaderstabs',
			'componentbuilderprivacytabs',
			'componentbuilderfieldorderingtabs',
			'componentbuilderactionlogcompiler',
			'componentbuilderexportcompiler',
			'componentbuilderfieldorderingcompiler',
			'componentbuilderheaderscompiler',
			'componentbuilderlanguagepackaging',
			'componentbuilderpowersautoloadercompiler',
			'componentbuilderprivacycompiler',
			'componentbuildercommands'
		];

		// Create a new query object.
		$query = $db->getQuery(true);
		// we must update the enabled field
		$fields = [
			$db->quoteName('enabled') . ' = 1'
		];
		// Conditions for which records should be updated.
		$conditions = [
			$db->quoteName('element') . ' IN (' . implode(',', array_map([$db, 'quote'], $plugins)) . ')'
		];
		// load the update query
		$query->update($db->quoteName('#__extensions'))->set($fields)->where($conditions);
		// Reset the query using our newly populated query object.
		$db->setQuery($query);

		$db->execute();
	}
}

