<?php declare(strict_types=1); 
 
namespace Shopware\Storefront\Theme; 
 
use Shopware\Core\Framework\App\Event\AppActivatedEvent; 
use Shopware\Core\Framework\App\Event\AppChangedEvent; 
use Shopware\Core\Framework\App\Event\AppDeactivatedEvent; 
use Shopware\Core\Framework\App\Event\AppUpdatedEvent; 
use Shopware\Storefront\Theme\StorefrontPluginConfiguration\AbstractStorefrontPluginConfigurationFactory; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
 
class ThemeAppLifecycleHandler implements EventSubscriberInterface 
{ 
    /** 
     * @var StorefrontPluginRegistryInterface 
     */ 
    private $themeRegistry; 
 
    /** 
     * @var AbstractStorefrontPluginConfigurationFactory 
     */ 
    private $themeConfigFactory; 
 
    /** 
     * @var ThemeLifecycleHandler 
     */ 
    private $themeLifecycleHandler; 
 
    /** 
     * @internal 
     */ 
    public function __construct( 
        StorefrontPluginRegistryInterface $themeRegistry, 
        AbstractStorefrontPluginConfigurationFactory $themeConfigFactory, 
        ThemeLifecycleHandler $themeLifecycleHandler 
    ) { 
        $this->themeRegistry = $themeRegistry; 
        $this->themeConfigFactory = $themeConfigFactory; 
        $this->themeLifecycleHandler = $themeLifecycleHandler; 
    } 
 
    public static function getSubscribedEvents(): array 
    { 
        return [ 
            AppUpdatedEvent::class => 'handleAppActivationOrUpdate', 
            AppActivatedEvent::class => 'handleAppActivationOrUpdate', 
            AppDeactivatedEvent::class => 'handleUninstall', 
        ]; 
    } 
 
    public function handleAppActivationOrUpdate(AppChangedEvent $event): void 
    { 
        $app = $event->getApp(); 
        if (!$app->isActive()) { 
            return; 
        } 
 
        $configurationCollection = $this->themeRegistry->getConfigurations(); 
        $config = $configurationCollection->getByTechnicalName($app->getName()); 
 
        if (!$config) { 
            $config = $this->themeConfigFactory->createFromApp($app->getName(), $app->getPath()); 
            $configurationCollection = clone $configurationCollection; 
            $configurationCollection->add($config); 
        } 
 
        $this->themeLifecycleHandler->handleThemeInstallOrUpdate( 
            $config, 
            $configurationCollection, 
            $event->getContext() 
        ); 
    } 
 
    public function handleUninstall(AppDeactivatedEvent $event): void 
    { 
        $config = $this->themeRegistry->getConfigurations()->getByTechnicalName($event->getApp()->getName()); 
 
        if (!$config) { 
            return; 
        } 
 
        $this->themeLifecycleHandler->handleThemeUninstall($config, $event->getContext()); 
    } 
}