<?php

namespace Uhura\Grossmarkt\ViewHelpers;

use Closure;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;

/**
 * View helper for insert data from flexform to form
 */
class InsertValueViewHelper extends AbstractViewHelper
{
    use CompileWithRenderStatic;

    /**
     *  Initialize argument
     *
     * @return void
     */
    public function initializeArguments(): void
    {
        $this->registerArgument('path', 'string', 'Destination path', true);
        $this->registerArgument('source', 'array', 'Source array', true);
        $this->registerArgument('value', 'mixed', 'Value to inject', true);
    }

    /**
     * Render static function
     *
     * @param array                     $arguments             array of arguments
     * @param Closure                   $renderChildrenClosure render children closure
     * @param RenderingContextInterface $renderingContext      rendering context
     *
     * @return array|mixed
     */
    public static function renderStatic(
        array $arguments,
        \Closure $renderChildrenClosure,
        RenderingContextInterface $renderingContext
    ) {
        $keys = array_reverse(explode('.', $arguments['path']));

        $arr = $arguments['value'];

        foreach ($keys as $key) {
            $arr = static::setArrayValue($arr, $key);
        }

        return static::overwriteArray($arguments['source'], $arr);
    }

    /**
     * Insert value to array
     *
     * @param $arr "value" arguments
     * @param $key "key" "value" arguments
     *
     * @return array
     */
    protected static function setArrayValue($arr, $key): array
    {
        $result = [];

        $result[$key] = $arr;

        return $result;
    }

    /**
     * Overwrite array
     *
     * @param $source "source" arguments
     * @param $dest   "dest" arguments
     *
     * @return array
     */
    protected static function overwriteArray($source, $dest): array
    {
        foreach ($dest as $key => $value) {
            if (!isset($source[$key])) {
                $source[$key] = $value;
                continue;
            }

            if (is_array($value)) {
                $source[$key] = static::overwriteArray($source[$key], $dest[$key]);
                continue;
            }

            $source[$key] = $dest[$key];
        }

        return $source;
    }
}
