<?php

namespace Zab\ZabSite\ViewHelpers;

use TYPO3\CMS\Core\Database\Connection;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;

class PageCategoriesViewHelper extends AbstractViewHelper
{
    protected $escapeOutput = false;

    public function initializeArguments(): void
    {
        $this->registerArgument('pageUid', 'int', 'UID of the page', true);
        $this->registerArgument('as', 'string', 'Variable name for the categories', false, 'categories');
    }

    public function render(): string
    {
        $pageUid = (int)$this->arguments['pageUid'];
        $as = $this->arguments['as'];

        $categories = $this->getCategories($pageUid);

        $this->renderingContext->getVariableProvider()->add($as, $categories);
        $content = $this->renderChildren();
        $this->renderingContext->getVariableProvider()->remove($as);

        return (string)$content;
    }

    protected function getCategories(int $pageUid): array
    {
        $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
        $queryBuilder = $connectionPool->getQueryBuilderForTable('sys_category');

        return $queryBuilder
            ->select('c.uid', 'c.title', 'c.color')
            ->from('sys_category', 'c')
            ->join(
                'c',
                'sys_category_record_mm',
                'mm',
                $queryBuilder->expr()->eq('mm.uid_local', $queryBuilder->quoteIdentifier('c.uid'))
            )
            ->where(
                $queryBuilder->expr()->eq('mm.uid_foreign', $queryBuilder->createNamedParameter($pageUid, Connection::PARAM_INT)),
                $queryBuilder->expr()->eq('mm.tablenames', $queryBuilder->createNamedParameter('pages')),
                $queryBuilder->expr()->eq('mm.fieldname', $queryBuilder->createNamedParameter('categories'))
            )
            ->orderBy('mm.sorting_foreign')
            ->executeQuery()
            ->fetchAllAssociative();
    }
}
