<?php

// ------------------------------------------------------------------------------------------------------------------------------------------------ //

//* Standard-Encodierung definieren. *//

if ( function_exists('mb_internal_encoding') ) {
	mb_internal_encoding('UTF-8');
}

// ------------------------------------------------------------------------------------------------------------------------------------------------ //

//* Konstanten definieren. *//

if ( !defined('PORTAL_ROOT') )				define('PORTAL_ROOT',				'../../../');
if ( !defined('PORTAL_HOME') )				define('PORTAL_HOME',				PORTAL_ROOT.'client_area/');
if ( !defined('PORTAL_CORE') )				define('PORTAL_CORE',				PORTAL_HOME.'client_core/');
if ( !defined('PORTAL_CLIENT_AREA') )		define('PORTAL_CLIENT_AREA',			PORTAL_ROOT.'client_area/');
if ( !defined('PORTAL_ADMIN_AREA') )		define('PORTAL_ADMIN_AREA',			PORTAL_ROOT.'admin_area/');
if ( !defined('PORTAL_CORE_AREA') )			define('PORTAL_CORE_AREA',			PORTAL_ROOT.'core_area/');
if ( !defined('PORTAL_CONFIG_AREA') )		define('PORTAL_CONFIG_AREA',		PORTAL_ROOT.'config_area/');
if ( !defined('PORTAL_LITTLE_CORE_FILES') )	define('PORTAL_LITTLE_CORE_FILES',	PORTAL_CORE_AREA.'core_core/Toolkit/Extern/little_core_files/');
if ( !defined('PORTAL_OTHER_FILES') )		define('PORTAL_OTHER_FILES',		PORTAL_CORE_AREA.'core_core/Toolkit/Extern/other/');

# CSS, JS, HTML und Grafiken.
if ( !defined('PORTAL_CLIENT_LAYOUT') )		define('PORTAL_CLIENT_LAYOUT',		PORTAL_HOME.'client_layout/');

// ------------------------------------------------------------------------------------------------------------------------------------------------ //

//* Kontext ausführen. *//

# Weitere nötige Konstanten definieren und nötige Dateien einbinden.
#require_once PORTAL_CORE.'init.php';
require_once PORTAL_LITTLE_CORE_FILES.'core.php';
require_once PORTAL_LITTLE_CORE_FILES.'database/database.php';
require_once PORTAL_LITTLE_CORE_FILES.'database/database_client_prototype.php';
require_once PORTAL_LITTLE_CORE_FILES.'database/database_client_mysqli.php';
require_once PORTAL_LITTLE_CORE_FILES.'database/database_client_pdo.php';
# Kernbereich einbinden.
require_once PORTAL_CORE_AREA.'core_area.php';
require_once PORTAL_CORE_AREA.'core_basic.php';
// Konfiguration
$sAlternate = ( defined('PORTAL_ALTERNATE_NAME') ) ? PORTAL_ALTERNATE_NAME : '';
$sConfigPath = PORTAL_CONFIG_AREA;
if ( '' != $sAlternate ) {
	$sConfigPath = (is_file(PORTAL_ROOT.'src/'.$sAlternate.'/config_area/config_area.php')) ? PORTAL_ROOT.'src/'.$sAlternate.'/config_area/' : $sConfigPath;
}
require_once $sConfigPath.'config_area.php';
// Weitere Sicherheiten definieren.
if ( !defined('PROJECT_URL') ) {
	define('PROJECT_URL', \Project\BKP\Config_Helper::getInstance()->getPortalUrl());
}
$bAdminArea = ( isset($_SERVER['REQUEST_URI']) && '' != $_SERVER['REQUEST_URI'] && preg_match('/\/admin\//', $_SERVER['REQUEST_URI']) );
if ( $bAdminArea ) {
	$sConfigPath = PORTAL_ADMIN_AREA;
	if ( '' != $sAlternate ) {
		$sConfigPath = (is_file(PORTAL_ROOT.'src/'.$sAlternate.'/admin_area/admin_more_security.php')) ? PORTAL_ROOT.'src/'.$sAlternate.'/admin_area/' : $sConfigPath;
	}
	require_once $sConfigPath.'admin_more_security.php';
}
else {
	$sConfigPath = PORTAL_CLIENT_AREA;
	if ( '' != $sAlternate ) {
		$sConfigPath = (is_file(PORTAL_ROOT.'src/'.$sAlternate.'/client_area/client_more_security.php')) ? PORTAL_ROOT.'src/'.$sAlternate.'/client_area/' : $sConfigPath;
	}
	require_once $sConfigPath.'client_more_security.php';
}

use Extern\Little\Core\Database\DB;
use Core\Exception;
use Project\BKP\Configuration;
use Project\BKP\Ressource;
use Project\BKP\Database_Helper as DatabaseHelper;

# Variablen definieren.
$aPathCollector = array('font' => array(), 'css' => array(), 'js' => array(), 'elements' => array(), 'tpl' => array());
$sClientAreaPath = str_replace(PORTAL_ROOT, '', PORTAL_HOME.$_GET['layout']);
$sAdminAreaPath = str_replace(PORTAL_ROOT, '', PORTAL_ADMIN_AREA.$_GET['layout']);
$sCoreAreaPath = str_replace(PORTAL_ROOT, '', PORTAL_CORE_AREA.$_GET['layout']);

# Pfad global.
if ( DB::param('layout') and 'client_plugin' == $_GET['layout'] ) {
	$aPathCollector['font']['normal'] = PORTAL_ROOT.$sClientAreaPath.'/'.$_GET['pname'].'/layout/fonts/';
	$aPathCollector['css']['normal'] = PORTAL_ROOT.$sClientAreaPath.'/'.$_GET['pname'].'/layout/styles/';
	$aPathCollector['js']['normal'] = PORTAL_ROOT.$sClientAreaPath.'/'.$_GET['pname'].'/layout/scripts/';
	$aPathCollector['elements']['normal'] = PORTAL_ROOT.$sClientAreaPath.'/'.$_GET['pname'].'/layout/elements/';
	$aPathCollector['components']['normal'] = PORTAL_ROOT.$sClientAreaPath.'/'.$_GET['pname'].'/layout/components/';
}
else if ( DB::param('layout') and 'client_layout' == $_GET['layout'] ) {
	$aPathCollector['font']['normal'] = PORTAL_ROOT.$sClientAreaPath.'/fonts/';
	$aPathCollector['css']['normal'] = PORTAL_ROOT.$sClientAreaPath.'/styles/';
	$aPathCollector['js']['normal'] = PORTAL_ROOT.$sClientAreaPath.'/scripts/';
	$aPathCollector['elements']['normal'] = PORTAL_ROOT.$sClientAreaPath.'/elements/';
	$aPathCollector['components']['normal'] = PORTAL_ROOT.$sClientAreaPath.'/components/';
}
else if ( DB::param('layout') and 'admin_layout' == $_GET['layout'] ) {
	$aPathCollector['font']['normal'] = PORTAL_ROOT.$sAdminAreaPath.'/fonts/';
	$aPathCollector['css']['normal'] = PORTAL_ROOT.$sAdminAreaPath.'/styles/';
	$aPathCollector['js']['normal'] = PORTAL_ROOT.$sAdminAreaPath.'/scripts/';
	$aPathCollector['elements']['normal'] = PORTAL_ROOT.$sAdminAreaPath.'/elements/';
	$aPathCollector['components']['normal'] = PORTAL_ROOT.$sAdminAreaPath.'/components/';
}
else if ( DB::param('layout') and 'core_layout' == $_GET['layout'] ) {
	$aPathCollector['font']['normal'] = PORTAL_ROOT.$sCoreAreaPath.'/fonts/';
	$aPathCollector['css']['normal'] = PORTAL_ROOT.$sCoreAreaPath.'/styles/';
	$aPathCollector['js']['normal'] = PORTAL_ROOT.$sCoreAreaPath.'/scripts/';
	$aPathCollector['elements']['normal'] = PORTAL_ROOT.$sCoreAreaPath.'/elements/';
	$aPathCollector['components']['normal'] = PORTAL_ROOT.$sCoreAreaPath.'/components/';
}

# Pfad Kundenanpassung.
$sAlternate = ( defined('PORTAL_ALTERNATE_NAME') ) ? PORTAL_ALTERNATE_NAME : '';
if ( '' != $sAlternate ) {
	$sClientAreaPath = PORTAL_ROOT.'src/'.$sAlternate.'/'.$sClientAreaPath;
	$sAdminAreaPath = PORTAL_ROOT.'src/'.$sAlternate.'/'.$sAdminAreaPath;
	$sCoreAreaPath = PORTAL_ROOT.'src/'.$sAlternate.'/'.$sCoreAreaPath;

	if ( DB::param('layout') and 'client_plugin' == $_GET['layout'] ) {
		if ( is_dir($sClientAreaPath.'/'.$_GET['pname'].'/layout/fonts/') ) {
			$aPathCollector['font']['src'] = $sClientAreaPath.'/'.$_GET['pname'].'/layout/fonts/';
		}
		if ( is_dir($sClientAreaPath.'/'.$_GET['pname'].'/layout/styles/') ) {
			$aPathCollector['css']['src'] = $sClientAreaPath.'/'.$_GET['pname'].'/layout/styles/';
		}
		if ( is_dir($sClientAreaPath.'/'.$_GET['pname'].'/layout/scripts/') ) {
			$aPathCollector['js']['src'] = $sClientAreaPath.'/'.$_GET['pname'].'/layout/scripts/';
		}
		if ( is_dir($sClientAreaPath.'/'.$_GET['pname'].'/layout/elements/') ) {
			$aPathCollector['elements']['src'] = $sClientAreaPath.'/'.$_GET['pname'].'/layout/elements/';
		}
		if ( is_dir($sClientAreaPath.'/'.$_GET['pname'].'/layout/scripts/') ) {
			$aPathCollector['components']['src'] = $sClientAreaPath.'/'.$_GET['pname'].'/layout/components/';
		}
	}
	else if ( DB::param('layout') and 'client_layout' == $_GET['layout'] ) {
		if ( is_dir($sClientAreaPath.'/fonts/') ) {
			$aPathCollector['font']['src'] = $sClientAreaPath.'/fonts/';
		}
		if ( is_dir($sClientAreaPath.'/styles/') ) {
			$aPathCollector['css']['src'] = $sClientAreaPath.'/styles/';
		}
		if ( is_dir($sClientAreaPath.'/scripts/') ) {
			$aPathCollector['js']['src'] = $sClientAreaPath.'/scripts/';
		}
		if ( is_dir($sClientAreaPath.'/elements/') ) {
			$aPathCollector['elements']['src'] = $sClientAreaPath.'/elements/';
		}
		if ( is_dir($sClientAreaPath.'/scripts/') ) {
			$aPathCollector['components']['src'] = $sClientAreaPath.'/components/';
		}
	}
	else if ( DB::param('layout') and 'admin_layout' == $_GET['layout'] ) {
		if ( is_dir($sAdminAreaPath.'/fonts/') ) {
			$aPathCollector['font']['src'] = $sAdminAreaPath.'/fonts/';
		}
		if ( is_dir($sAdminAreaPath.'/styles/') ) {
			$aPathCollector['css']['src'] = $sAdminAreaPath.'/styles/';
		}
		if ( is_dir($sAdminAreaPath.'/scripts/') ) {
			$aPathCollector['js']['src'] = $sAdminAreaPath.'/scripts/';
		}
		if ( is_dir($sAdminAreaPath.'/elements/') ) {
			$aPathCollector['elements']['src'] = $sAdminAreaPath.'/elements/';
		}
		if ( is_dir($sAdminAreaPath.'/scripts/') ) {
			$aPathCollector['components']['src'] = $sAdminAreaPath.'/components/';
		}
	}
	else if ( DB::param('layout') and 'core_layout' == $_GET['layout'] ) {
		if ( is_dir($sCoreAreaPath.'/fonts/') ) {
			$aPathCollector['font']['src'] = $sCoreAreaPath.'/fonts/';
		}
		if ( is_dir($sCoreAreaPath.'/styles/') ) {
			$aPathCollector['css']['src'] = $sCoreAreaPath.'/styles/';
		}
		if ( is_dir($sCoreAreaPath.'/scripts/') ) {
			$aPathCollector['js']['src'] = $sCoreAreaPath.'/scripts/';
		}
		if ( is_dir($sCoreAreaPath.'/elements/') ) {
			$aPathCollector['elements']['src'] = $sCoreAreaPath.'/elements/';
		}
		if ( is_dir($sCoreAreaPath.'/scripts/') ) {
			$aPathCollector['components']['src'] = $sCoreAreaPath.'/components/';
		}
	}
}

# Ggf. Umwandeln.
$sContextContent = '..mhhh, kein Pfad zum Layout da :/ !?';
if ( !empty($aPathCollector['css']) ) {
	DatabaseHelper::getInstance()->changeDatabaseClient('bkp');
	$aBKPConfiguration = Configuration::getInstance()->get('global');
	$oPortalRessource = new Ressource(
		array(
			'get'			=> $_GET,
			'path_font'		=> $aPathCollector['font'],
			'path_css'		=> $aPathCollector['css'],
			'path_js'		=> $aPathCollector['js'],
			'path_elements'	=> $aPathCollector['elements'],
			'path_components'	=> $aPathCollector['components']
		)
	);
	$sContextContent = $oPortalRessource->render();
	$bIsFont = $oPortalRessource->isFont();
	$sContentType = $oPortalRessource->getContentType();

	if ( !$bIsFont ) {
		// js importe beachten und modifizieren
		switch ( $oPortalRessource->getType() ) {
			case 'js':
			case 'cjs':
				$iDevelopDate = $aBKPConfiguration['develop_date'] ?? 0;
				$sContextContent = preg_replace('/import([^\n]+)\.js([\'\"])/', 'import$1.js?fdate='.$iDevelopDate.'$2', $sContextContent);
				break;
		}
	}

	# Header setzen.
	header('Pragma: no-cache');
	header('Cache-Control: no-store, no-cache, must-revalidate');
	if (
		!$bIsFont
		and ( isset($aBKPConfiguration['allow_maxage']) and 1 == intVal($aBKPConfiguration['allow_maxage']) )
		and 0 < intVal($aBKPConfiguration['maxage'])
	) {
		$iMaxAge = intVal($aBKPConfiguration['maxage']);
		header('Pragma: public');
		header('Cache-Control: max-age='.$iMaxAge.', must-revalidate');
		header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $iMaxAge) . ' GMT');
	}
	else if ( $bIsFont ) {
		$sPathToFile = $oPortalRessource->getPathToFile();
		$sFileName = basename($sPathToFile);
		// Harter Abbruch!
		if ( !is_file($sPathToFile) ) {
			throw new Exception('Hier liegt ein Problem mit der Datei vor. Bitte prüfen. Verlangt: '.$sPathToFile);
		}
		// Größe einsammeln.
		$iFileSize = filesize($sPathToFile);
		// Ausgabe und weitere nötige Header.
		header('Content-Disposition: attachment; filename="'.$sFileName.'"');
		header('Content-Length: '.$iFileSize);
		header('Content-Type: '.$sContentType);
		readfile($sPathToFile);
		exit;
	}
	header('Content-Type: '.$sContentType);
}
echo $sContextContent;
