<?php

declare(strict_types=1);

namespace Zab\ZabSite\DataProcessing;

use TYPO3\CMS\Core\Http\Uri;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
use TYPO3\CMS\Frontend\ContentObject\DataProcessorInterface;

/**
 * Keeps selected GET parameters in language menu links.
 *
 * TYPO3's LanguageMenuProcessor drops every parameter excluded from cHash calculation
 * (e.g. tx_zabfaqs), so they are re-added here for the configured top-level parameter names.
 */
class LanguageMenuQueryParamsProcessor implements DataProcessorInterface
{
    public function process(
        ContentObjectRenderer $cObj,
        array $contentObjectConfiguration,
        array $processorConfiguration,
        array $processedData
    ): array {
        $source = (string)($processorConfiguration['source'] ?? 'languageMenu');
        $parameterNames = GeneralUtility::trimExplode(',', (string)($processorConfiguration['parameters'] ?? ''), true);

        if ($parameterNames === [] || !isset($processedData[$source]) || !is_array($processedData[$source])) {
            return $processedData;
        }

        $currentParams = array_intersect_key(
            $cObj->getRequest()->getQueryParams(),
            array_flip($parameterNames)
        );
        if ($currentParams === []) {
            return $processedData;
        }

        foreach ($processedData[$source] as $index => $languageItem) {
            if (!is_array($languageItem) || (string)($languageItem['link'] ?? '') === '') {
                continue;
            }

            $uri = new Uri($languageItem['link']);
            parse_str($uri->getQuery(), $linkParams);
            $merged = array_replace($currentParams, $linkParams);
            $processedData[$source][$index]['link'] = (string)$uri->withQuery(http_build_query($merged, '', '&', PHP_QUERY_RFC3986));
        }

        return $processedData;
    }
}
