<?php

namespace Wga\Core\ViewHelpers;

use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
use TYPO3Fluid\Fluid\Core\ViewHelper\Exception;

/**
 * This is XClass, but it is also used directly by namespace in the 500 error template.
 *
 * Class TranslateViewHelper.
 */
class TranslateViewHelper extends AbstractViewHelper
{
	public function initializeArguments(): void
	{
		$this->registerArgument('key', 'string', 'Translation Key');
		$this->registerArgument('id', 'string', 'Translation ID. Same as key.');
		$this->registerArgument('default', 'string', 'If the given locallang key could not be found, this value is used. If this argument is not set, child nodes will be used to render the default');
		$this->registerArgument('arguments', 'array', 'Arguments to be replaced in the resulting string');
		$this->registerArgument('extensionName', 'string', 'UpperCamelCased extension key (for example BlogExample)');
		$this->registerArgument('languageKey', 'string', 'Language key ("da" for example) or "default" to use. If empty, use current language. Ignored in non-extbase context.');
	}

	/**
     * Return array element by key.
     *
     * @param array $arguments
     * @param \Closure $renderChildrenClosure
     * @param RenderingContextInterface $renderingContext
     * @throws Exception
     * @return string
     */
    public static function renderStatic(
        array $arguments,
        \Closure $renderChildrenClosure,
        RenderingContextInterface $renderingContext
    ) {
        $key = $arguments['key'];
        $id = $arguments['id'];
        $default = $arguments['default'];
        $translateArguments = $arguments['arguments'];
        $extensionName = $arguments['extensionName'];

        // Use key if id is empty.
        if ($id === null) {
            $id = $key;
        }

        if ((string)$id === '') {
            throw new Exception('An argument "key" or "id" has to be provided', 1351584844);
        }
        try {
            $request = $renderingContext->getRequest();
            $extensionName = $extensionName ?? $request->getControllerExtensionName();
        } catch (\Throwable $e) { // Catch error on static template render (500 error page).
            $extensionName = $arguments['extensionName'];
        }

        try {
            $value = static::translate(
                $id,
                $extensionName,
                $translateArguments,
                $arguments['languageKey']
            );
        } catch (\InvalidArgumentException $e) {
            $value = null;
        }
        if ($value === null) {
            $value = $default ?? $renderChildrenClosure();
            if (!empty($translateArguments)) {
                $value = vsprintf($value, $translateArguments);
            }
        }
        return $value;
    }

	/**
	 * Wrapper call to static LocalizationUtility
	 *
	 * @param string $id Translation Key
	 * @param string $extensionName UpperCamelCased extension key (for example BlogExample)
	 * @param array $arguments Arguments to be replaced in the resulting string
	 * @param string $languageKey Language key to use for this translation
	 * @param string[] $alternativeLanguageKeys Alternative language keys if no translation does exist
	 *
	 * @return string|null
	 */
	protected static function translate($id, $extensionName, $arguments, $languageKey)
	{
		return LocalizationUtility::translate($id, $extensionName, $arguments, $languageKey);
	}
}
