<?php
declare(strict_types = 1);

namespace Wga\WgaFaq\Controller;

use TYPO3\CMS\Core\TypoScript\TypoScriptService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
use Wga\WgaFaq\Domain\Model\Faq;
use Wga\WgaFaq\Domain\Repository\FaqRepository;

/**
 * Class FaqController
 */
class FaqController extends ActionController
{
    /**
     * @var FaqRepository
     */
    protected $faqRepository;

    /**
     * @param FaqRepository $faqRepository
     * @return void
     */
    public function injectFaqRepository(FaqRepository $faqRepository)
    {
        $this->faqRepository = $faqRepository;
    }

	/**
	 * @var ContentObjectRenderer
	 */
	protected $contentObjectRenderer;
	
    /**
     * Injects the Configuration Manager and is initializing the framework settings
     *
     * @param ConfigurationManagerInterface $configurationManager Instance of the Configuration Manager
     *
     * @return void
     */
    public function buildSettings()
    {
        $originalSettings = $this->configurationManager->getConfiguration(
            ConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS
        );

		/** @var ContentObjectRenderer $contentObjectRenderer */
		$this->contentObjectRenderer = $this->request->getAttribute('currentContentObject');

        // Use stdWrap for given defined settings
        if (isset($originalSettings['useStdWrap']) && !empty($originalSettings['useStdWrap'])) {
            $typoScriptService = GeneralUtility::makeInstance(TypoScriptService::class);
            $typoScriptArray = $typoScriptService->convertPlainArrayToTypoScriptArray($originalSettings);
            $stdWrapProperties = GeneralUtility::trimExplode(',', $originalSettings['useStdWrap'], true);
            foreach ($stdWrapProperties as $key) {
                if (is_array($typoScriptArray[$key . '.'])) {
                    $originalSettings[$key] = $this->configurationManager->getContentObject()->stdWrap(
                        $typoScriptArray[$key] ?? '',
                        $typoScriptArray[$key . '.']
                    );
                }
            }
        }

        $this->settings = $originalSettings;
    }

    /**
     * Initializes the current action
     *
     * @return void
     */
    public function initializeAction()
    {
        $this->buildSettings();
    }

    /**
     * @return void
     */
    public function listAction()
    {
        $startingpoints = $this->settings['startingpoint'];
        $limit = (int)$this->settings['limit'];
        $faqItems = $this->faqRepository->findAllRecords($startingpoints, $limit);
        $this->view->assignMultiple([
            'faqItems' => $faqItems,
            'data' => $this->contentObjectRenderer->data
        ]);

        return $this->htmlResponse();
    }

    /**
     * @param Faq $faq
     * @return void
     */
    public function detailAction(Faq $faq)
    {
        $this->view->assign('faq', $faq);
    }
}
