<?php 
 
namespace App\Controller; 
 
use JsonException; 
use App\Entity\Page; 
use App\Entity\PageBlock; 
use App\Repository\MenuRepository; 
use Doctrine\Persistence\ManagerRegistry; 
use Doctrine\Persistence\ObjectManager; 
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
use Symfony\Component\HttpFoundation\Request; 
 
abstract class PageController extends AbstractController 
{ 
    protected ObjectManager $entityManager; 
    protected string  $locale; 
    protected array $datas = []; 
 
    protected MenuRepository $menuRepository; 
 
    protected $slug; 
 
    public function __construct(ManagerRegistry $doctrine, MenuRepository $menuRepository) 
    { 
        $this->entityManager = $doctrine->getManager(); 
 
        $this->menuRepository = $menuRepository; 
    } 
 
    protected function _getMetasPage($page) 
    { 
        if ($page->getMetas() && isset($page->getMetas()[$this->locale])) { 
            $this->datas['metas'] = $page->getMetas()[$this->locale]; 
        } 
    } 
 
    protected function _getDataHeader(?string $locale = null) 
    { 
        $page_blocks = $this->entityManager->getRepository(PageBlock::class)->getbyNameByBlockType('header', $locale ?? $this->locale); 
 
        $this->datas['header'] = $this->_getData($page_blocks); 
 
        return $this->datas['header']; 
    } 
 
    protected function _getDataFooter(?string $locale = null) 
    { 
        $page_blocks = $this->entityManager->getRepository(PageBlock::class)->getbyNameByBlockType('footer', $locale ?? $this->locale); 
 
        $this->datas['footer'] = $this->_getData($page_blocks); 
 
        return $this->datas['footer']; 
    } 
 
    /** 
     * @return ?string 
     */ 
    protected function _getSlug(?string $slug = null): ?string 
    { 
        return $this->datas['slug'] = $slug; 
    } 
 
    protected function _getPage(string $slug) 
    { 
        return $this->datas['page'] = $this->entityManager->getRepository(Page::class)->getPageBySlugs($slug); 
    } 
 
    /** 
     * @throws JsonException 
     */ 
    public function _getMenus(): array 
    { 
        $menu = $this->menuRepository->findOneBy(['name' => 'main_menu']); 
 
        return $this->datas['menus'] = json_decode($menu->getJsonData(), null, 512, JSON_THROW_ON_ERROR); 
    } 
 
    /** 
     * @throws JsonException 
     */ 
    protected function _initDatas(Request $request, ?string $slug = null) 
    { 
        $this->locale = $request->getLocale(); 
        $this->datas['locale'] = $this->locale; 
 
        $this->_getSlug($slug); 
 
        if (!isset($this->datas['header'])) { 
            $this->_getDataHeader(); 
        } 
 
        if (!isset($this->datas['footer'])) { 
            $this->_getDataFooter(); 
        } 
 
        if (!isset($this->datas['page']) && isset($this->datas['slug'])) { 
            $this->_getPage($this->datas['slug']); 
        } 
 
        if (!isset($this->datas['metas']) && isset($this->datas['page'])) { 
            $this->_getMetasPage($this->datas['page']); 
        } 
 
        if (!isset($this->datas['menus'])) { 
            $this->_getMenus(); 
        } 
    } 
 
    /* 
     * 03/11/2021 update Manage Preview for draft 
     */ 
    protected function _getData(array $page_blocks) 
    { 
        $request = Request::createFromGlobals(); 
 
        foreach ($page_blocks as $key => $pb) { 
            $jsonDatas = $request->get('preview') ? $pb->getJsonDataPreview() : $pb->getJsonData(); 
 
            $pb->datas = json_decode($jsonDatas ?? $pb->getJsonData(), true, 512, JSON_THROW_ON_ERROR); 
 
            if ($pb->getBlock() && true === $pb->getBlock()->getSubBlock()) { 
                foreach ($pb->getBlockChildrens() as $p_b) { 
                    $p_b->json = json_decode($p_b->getjsonData(), true, 512, JSON_THROW_ON_ERROR); 
                } 
            } 
        } 
 
        return $page_blocks; 
    } 
 
    public function getDatas(array $extraData = []): array 
    { 
        return array_merge($this->datas, $extraData); 
    } 
 
    protected function getPageByType(string $type) 
    { 
        switch ($type) { 
            case 'vehicle': 
                $page = $this->entityManager->getRepository(Page::class)->getPageBySlug('account-vehicle'); 
                break; 
            case 'appointment': 
                $page = $this->entityManager->getRepository(Page::class)->getPageBySlug('account-appointment'); 
                break; 
            case 'profil': 
                $page = $this->entityManager->getRepository(Page::class)->getPageBySlug('account-profil'); 
                break; 
            case 'history': 
                $page = $this->entityManager->getRepository(Page::class)->getPageBySlug('account-history'); 
                break; 
            default: 
                $page = $this->entityManager->getRepository(Page::class)->getPageBySlug($type); 
                break; 
        } 
 
        $this->datas['page'] = $page; 
 
        return $page; 
    } 
}