<?php 
 
namespace EasyCorp\Bundle\EasyAdminBundle\Context; 
 
use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA; 
use EasyCorp\Bundle\EasyAdminBundle\Config\UserMenu; 
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Controller\DashboardControllerInterface; 
use EasyCorp\Bundle\EasyAdminBundle\Dto\AssetsDto; 
use EasyCorp\Bundle\EasyAdminBundle\Dto\CrudDto; 
use EasyCorp\Bundle\EasyAdminBundle\Dto\DashboardDto; 
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto; 
use EasyCorp\Bundle\EasyAdminBundle\Dto\I18nDto; 
use EasyCorp\Bundle\EasyAdminBundle\Dto\MainMenuDto; 
use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto; 
use EasyCorp\Bundle\EasyAdminBundle\Dto\UserMenuDto; 
use EasyCorp\Bundle\EasyAdminBundle\Factory\MenuFactory; 
use EasyCorp\Bundle\EasyAdminBundle\Registry\CrudControllerRegistry; 
use EasyCorp\Bundle\EasyAdminBundle\Registry\TemplateRegistry; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Security\Core\User\UserInterface; 
 
/** 
 * A context object that stores all the state and config of the current admin request. 
 * 
 * @author Javier Eguiluz <javier.eguiluz@gmail.com> 
 */ 
final class AdminContext 
{ 
    private $request; 
    private $user; 
    private $i18nDto; 
    private $crudControllers; 
    private $entityDto; 
    private $dashboardDto; 
    private $dashboardControllerInstance; 
    private $assetDto; 
    private $crudDto; 
    private $searchDto; 
    private $menuFactory; 
    private $templateRegistry; 
    private $mainMenuDto; 
    private $userMenuDto; 
 
    public function __construct(Request $request, ?UserInterface $user, I18nDto $i18nDto, CrudControllerRegistry $crudControllers, DashboardDto $dashboardDto, DashboardControllerInterface $dashboardController, AssetsDto $assetDto, ?CrudDto $crudDto, ?EntityDto $entityDto, ?SearchDto $searchDto, MenuFactory $menuFactory, TemplateRegistry $templateRegistry) 
    { 
        $this->request = $request; 
        $this->user = $user; 
        $this->i18nDto = $i18nDto; 
        $this->crudControllers = $crudControllers; 
        $this->dashboardDto = $dashboardDto; 
        $this->dashboardControllerInstance = $dashboardController; 
        $this->crudDto = $crudDto; 
        $this->assetDto = $assetDto; 
        $this->entityDto = $entityDto; 
        $this->searchDto = $searchDto; 
        $this->menuFactory = $menuFactory; 
        $this->templateRegistry = $templateRegistry; 
    } 
 
    public function getRequest(): Request 
    { 
        return $this->request; 
    } 
 
    public function getReferrer(): ?string 
    { 
        return $this->request->query->get(EA::REFERRER); 
    } 
 
    public function getI18n(): I18nDto 
    { 
        return $this->i18nDto; 
    } 
 
    public function getCrudControllers(): CrudControllerRegistry 
    { 
        return $this->crudControllers; 
    } 
 
    public function getEntity(): EntityDto 
    { 
        return $this->entityDto; 
    } 
 
    public function getUser(): ?UserInterface 
    { 
        return $this->user; 
    } 
 
    public function getAssets(): AssetsDto 
    { 
        return $this->assetDto; 
    } 
 
    public function getSignedUrls(): bool 
    { 
        return $this->dashboardDto->getSignedUrls(); 
    } 
 
    public function getAbsoluteUrls(): bool 
    { 
        return $this->dashboardDto->getAbsoluteUrls(); 
    } 
 
    public function getDashboardTitle(): string 
    { 
        return $this->dashboardDto->getTitle(); 
    } 
 
    public function getDashboardFaviconPath(): string 
    { 
        return $this->dashboardDto->getFaviconPath(); 
    } 
 
    public function getDashboardControllerFqcn(): string 
    { 
        return \get_class($this->dashboardControllerInstance); 
    } 
 
    public function getDashboardRouteName(): string 
    { 
        return $this->dashboardDto->getRouteName(); 
    } 
 
    public function getDashboardContentWidth(): string 
    { 
        return $this->dashboardDto->getContentWidth(); 
    } 
 
    public function getDashboardSidebarWidth(): string 
    { 
        return $this->dashboardDto->getSidebarWidth(); 
    } 
 
    public function getMainMenu(): MainMenuDto 
    { 
        if (null !== $this->mainMenuDto) { 
            return $this->mainMenuDto; 
        } 
 
        $configuredMenuItems = $this->dashboardControllerInstance->configureMenuItems(); 
        $mainMenuItems = \is_array($configuredMenuItems) ? $configuredMenuItems : iterator_to_array($configuredMenuItems, false); 
        $selectedMenuIndex = $this->request->query->getInt(EA::MENU_INDEX, -1); 
        $selectedMenuSubIndex = $this->request->query->getInt(EA::SUBMENU_INDEX, -1); 
 
        return $this->mainMenuDto = $this->menuFactory->createMainMenu($mainMenuItems, $selectedMenuIndex, $selectedMenuSubIndex); 
    } 
 
    public function getUserMenu(): UserMenuDto 
    { 
        if (null !== $this->userMenuDto) { 
            return $this->userMenuDto; 
        } 
 
        if (null === $this->user) { 
            return UserMenu::new()->getAsDto(); 
        } 
 
        $userMenu = $this->dashboardControllerInstance->configureUserMenu($this->user); 
 
        return $this->userMenuDto = $this->menuFactory->createUserMenu($userMenu); 
    } 
 
    public function getCrud(): ?CrudDto 
    { 
        return $this->crudDto; 
    } 
 
    public function getSearch(): ?SearchDto 
    { 
        return $this->searchDto; 
    } 
 
    public function getTemplatePath(string $templateName): string 
    { 
        return $this->templateRegistry->get($templateName); 
    } 
}