<?php 
 
declare(strict_types=1); 
 
namespace League\Bundle\OAuth2ServerBundle; 
 
use League\Bundle\OAuth2ServerBundle\DependencyInjection\CompilerPass\EncryptionKeyPass; 
use League\Bundle\OAuth2ServerBundle\DependencyInjection\CompilerPass\RegisterDoctrineOrmMappingPass; 
use League\Bundle\OAuth2ServerBundle\DependencyInjection\LeagueOAuth2ServerExtension; 
use League\Bundle\OAuth2ServerBundle\DependencyInjection\Security\OAuth2Factory; 
use Symfony\Bundle\SecurityBundle\DependencyInjection\SecurityExtension; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; 
use Symfony\Component\HttpKernel\Bundle\Bundle; 
 
final class LeagueOAuth2ServerBundle extends Bundle 
{ 
    /** 
     * {@inheritdoc} 
     * 
     * @return void 
     */ 
    public function build(ContainerBuilder $container) 
    { 
        parent::build($container); 
 
        $this->configureDoctrineExtension($container); 
        $this->configureSecurityExtension($container); 
    } 
 
    /** 
     * {@inheritdoc} 
     */ 
    public function getContainerExtension(): ExtensionInterface 
    { 
        return new LeagueOAuth2ServerExtension(); 
    } 
 
    private function configureSecurityExtension(ContainerBuilder $container): void 
    { 
        /** @var SecurityExtension $extension */ 
        $extension = $container->getExtension('security'); 
 
        if (method_exists($extension, 'addAuthenticatorFactory')) { 
            $extension->addAuthenticatorFactory(new OAuth2Factory()); 
 
            return; 
        } 
 
        /** 
         * @psalm-suppress DeprecatedMethod 
         * @psalm-suppress InvalidArgument 
         */ 
        $extension->addSecurityListenerFactory(new OAuth2Factory()); 
    } 
 
    private function configureDoctrineExtension(ContainerBuilder $container): void 
    { 
        $container->addCompilerPass(new RegisterDoctrineOrmMappingPass()); 
        $container->addCompilerPass(new EncryptionKeyPass()); 
    } 
}