<?php

namespace Wga\Core\Controller;

use TYPO3\CMS\Core\Controller\ErrorPageController as CoreErrorPageController;
use TYPO3\CMS\Core\Http\HtmlResponse;
use TYPO3\CMS\Core\Messaging\AbstractMessage;
use TYPO3\CMS\Core\Page\PageRenderer;
use TYPO3\CMS\Core\Site\Entity\Site;
use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
use TYPO3\CMS\Core\Utility\GeneralUtility;

/**
 * Class ErrorPageController.
 */
class ErrorPageController extends CoreErrorPageController
{
	/**
	 * @param string $title
	 * @param string $message
	 * @param int $errorCode
	 * @param int|null $httpStatusCode
	 *
	 * @return string
	 */
	public function errorAction(
		string $title,
		string $message,
		int $errorCode = 0,
		?int $httpStatusCode = null
	): string {
		$errorHandlingConfig =  $this->getErrorHandlingConfig();
		if ($errorHandlingConfig) {
			$this->view->getTemplatePaths()->setTemplatePathAndFilename(
				GeneralUtility::getFileAbsFileName($errorHandlingConfig['errorFluidTemplate'])
			);
			$this->view->getTemplatePaths()->setTemplateRootPaths(
				[GeneralUtility::getFileAbsFileName($errorHandlingConfig['errorFluidTemplatesRootPath'])]
			);
			$this->view->getTemplatePaths()->setLayoutRootPaths(
				[GeneralUtility::getFileAbsFileName($errorHandlingConfig['errorFluidLayoutsRootPath'])]
			);
			$this->view->getTemplatePaths()->setPartialRootPaths(
				[GeneralUtility::getFileAbsFileName($errorHandlingConfig['errorFluidPartialsRootPath'])]
			);

			$variables = [
				'title' => $title,
				'message' => $message,
				'severity' => $severity,
				'errorCode' => $errorCode,
			];

			$this->view->assignMultiple($variables);

			// Render template vai page renderer to add HeaderAssets and FooterAssets sections.
			$pageRenderer =  GeneralUtility::makeInstance(PageRenderer::class);

			$headerAssets = $this->view->renderSection('HeaderAssets', $variables, true);
			$footerAssets = $this->view->renderSection('FooterAssets', $variables, true);

			if (!empty(trim($headerAssets))) {
				$pageRenderer->addHeaderData($headerAssets);
			}
			if (!empty(trim($footerAssets))) {
				$pageRenderer->addFooterData($footerAssets);
			}

			$pageRenderer->addBodyContent( $this->view->render() );

			return $pageRenderer->render();
		}

		return parent::errorAction($title, $message, $severity, $errorCode);
	}

	/**
	 * @return Site|null
	 */
	protected function getSiteConfig()
	{
		$siteFinder = GeneralUtility::makeInstance(SiteFinder::class);

		$config = $siteFinder->getAllSites();

		foreach ($config as $siteConfig) {
			$base = $siteConfig->getBase();

			if ($base->getHost() === $_SERVER['HTTP_HOST']) {
				return $siteConfig;
			}
		}

		return null;
	}

	/**
	 * @return array
	 */
	protected function getErrorHandlingConfig(): array
	{
		$siteConfig = $this->getSiteConfig();

		if ($siteConfig) {
			$errorCode = http_response_code();
			$configuration = $siteConfig->getConfiguration();

			foreach ((array)($configuration['errorHandling'] ?? []) as $itemErrorHandling) {
				if ((int)$itemErrorHandling['errorCode'] === $errorCode && $itemErrorHandling['errorHandler'] === 'Fluid') {
					return $itemErrorHandling;
				}
			}
		}

		return [];
	}
}
