<?php

namespace Medienreaktor\Products\Domain\Repository;


use Medienreaktor\Products\Domain\Model\ProductGroup;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\QueryHelper;
use TYPO3\CMS\Core\Utility\GeneralUtility;

class PageRepository extends \TYPO3\CMS\Core\Domain\Repository\PageRepository
{

    public function findByDokType($doktype, $rootPid = 1)
    {
        $filteredPages = [];
        $allPages = [];

        $this->findByDokTypeRec($rootPid, $allPages);

        foreach ($allPages as $page) {
            if ($page["doktype"] == $doktype) {
                $filteredPages[] = $page;
            }
        }

        return $filteredPages;

    }

    private function findByDokTypeRec($rootPid, &$allPages): void
    {
        $pages = $this->getSubpagesForPages([ $rootPid ], '*', 'sorting', '', false);
        foreach ($pages as $page) {
            $this->findByDokTypeRec($page["uid"], $allPages);
            $allPages[$page["uid"]] = $page;
        }
    }

    /**
     * @param $productGroup ProductGroup
     * @param $disableGroupAccessCheck bool
     * @return array
     */
    public function findByProductGroup($productGroup, $disableGroupAccessCheck = true) {
        $result = [];
        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
        $queryBuilder->getRestrictions()->removeAll();
        $queryBuilder->select('*')
            ->from('pages')
            ->where(
                $queryBuilder->expr()->eq('productgroup', (int)$productGroup->getUid()),
                QueryHelper::stripLogicalOperatorPrefix($this->where_hid_del)
            );

        if (!$disableGroupAccessCheck) {
            $queryBuilder->andWhere(QueryHelper::stripLogicalOperatorPrefix($this->where_groupAccess));
        }

        $row = $queryBuilder->execute()->fetch();
        if ($row) {
            $this->versionOL('pages', $row);
            if (is_array($row)) {
                $result = $this->getPageOverlay($row);
            }
        }
        return $result;
    }

}