<?php declare(strict_types=1); 
 
namespace Shopware\Administration\System\SalesChannel\Subscriber; 
 
use Shopware\Core\Framework\Context; 
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository; 
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityDeletedEvent; 
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; 
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter; 
use Shopware\Core\System\User\Aggregate\UserConfig\UserConfigCollection; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
 
class SalesChannelUserConfigSubscriber implements EventSubscriberInterface 
{ 
    public const CONFIG_KEY = 'sales-channel-favorites'; 
 
    private EntityRepository $userConfigRepository; 
 
    /** 
     * @internal 
     */ 
    public function __construct(EntityRepository $userConfigRepository) 
    { 
        $this->userConfigRepository = $userConfigRepository; 
    } 
 
    public static function getSubscribedEvents(): array 
    { 
        return [ 
            'sales_channel.deleted' => 'onSalesChannelDeleted', 
        ]; 
    } 
 
    public function onSalesChannelDeleted(EntityDeletedEvent $deletedEvent): void 
    { 
        $context = $deletedEvent->getContext(); 
 
        $deletedSalesChannelIds = $deletedEvent->getIds(); 
 
        $writeUserConfigs = []; 
        foreach ($this->getAllFavoriteUserConfigs($context) as $userConfigEntity) { 
            $salesChannelIds = $userConfigEntity->getValue(); 
 
            if ($salesChannelIds === null) { 
                continue; 
            } 
 
            // Find matching IDs 
            $matchingIds = array_intersect($deletedSalesChannelIds, $salesChannelIds); 
 
            if (!$matchingIds) { 
                continue; 
            } 
 
            // Removes the IDs from $matchingIds from the array 
            $newUserConfigArray = array_diff($salesChannelIds, $matchingIds); 
            $writeUserConfigs[] = [ 
                'id' => $userConfigEntity->getId(), 
                'value' => array_values($newUserConfigArray), 
            ]; 
        } 
 
        $this->userConfigRepository->upsert($writeUserConfigs, $context); 
    } 
 
    private function getAllFavoriteUserConfigs(Context $context): UserConfigCollection 
    { 
        $criteria = new Criteria(); 
        $criteria->addFilter(new EqualsFilter('key', self::CONFIG_KEY)); 
 
        /** @var UserConfigCollection $result */ 
        $result = $this->userConfigRepository->search($criteria, $context)->getEntities(); 
 
        return $result; 
    } 
}