<?php

declare(strict_types=1);

namespace Zab\ZabSite\DataProcessing;

use TYPO3\CMS\Core\Site\Entity\Site;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
use TYPO3\CMS\Frontend\ContentObject\DataProcessorInterface;

/**
 * Adds a raw hreflang field from Site Configuration languages to language menu items.
 *
 * Unlike TYPO3's computed hreflang, this value does not fallback to locale.
 */
class LanguageMenuRawHreflangProcessor implements DataProcessorInterface
{
    public function process(
        ContentObjectRenderer $cObj,
        array $contentObjectConfiguration,
        array $processorConfiguration,
        array $processedData
    ): array {
        $source = (string)($processorConfiguration['source'] ?? 'languageMenu');
        $targetField = (string)($processorConfiguration['targetField'] ?? 'hreflangRaw');

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

        $request = $cObj->getRequest();
        $site = $request->getAttribute('site');
        if (!$site instanceof Site) {
            return $processedData;
        }

        $rawHreflangByLanguageId = [];
        $languagesConfig = $site->getConfiguration()['languages'] ?? [];

        foreach ($languagesConfig as $languageConfig) {
            if (!is_array($languageConfig)) {
                continue;
            }

            $languageId = (int)($languageConfig['languageId'] ?? -1);
            if ($languageId < 0) {
                continue;
            }

            // Keep exactly what is configured; when empty or missing, keep empty string.
            $rawHreflangByLanguageId[$languageId] = trim((string)($languageConfig['hreflang'] ?? ''));
        }

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

            $languageId = (int)($languageItem['languageId'] ?? -1);
            $processedData[$source][$index][$targetField] = $rawHreflangByLanguageId[$languageId] ?? '';
        }

        return $processedData;
    }
}
