<?php declare(strict_types=1); 
 
namespace Shopware\Core\System\Country; 
 
use Doctrine\DBAL\Connection; 
use Shopware\Core\Framework\DataAbstractionLayer\Doctrine\RetryableQuery; 
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent; 
use Shopware\Core\Framework\Feature; 
use Shopware\Core\Framework\Uuid\Uuid; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
 
/** 
 * @deprecated tag:v6.5.0 - reason:remove-subscriber - Will be remove on version 6.5.0 
 */ 
class CountryTaxFreeDeprecationUpdater implements EventSubscriberInterface 
{ 
    private bool $blueGreenEnabled; 
 
    private Connection $connection; 
 
    /** 
     * @internal 
     */ 
    public function __construct(bool $blueGreenEnabled, Connection $connection) 
    { 
        $this->blueGreenEnabled = $blueGreenEnabled; 
        $this->connection = $connection; 
    } 
 
    public static function getSubscribedEvents(): array 
    { 
        if (Feature::isActive('v6.5.0.0')) { 
            return []; 
        } 
 
        return [ 
            CountryEvents::COUNTRY_WRITTEN_EVENT => 'updated', 
        ]; 
    } 
 
    public function updated(EntityWrittenEvent $event): void 
    { 
        if ($this->blueGreenEnabled) { 
            return; 
        } 
 
        $taxFreePort = []; 
        $companyTaxFreePort = []; 
        $taxFreeBackport = []; 
        $companyTaxFreeBackport = []; 
        foreach ($event->getPayloads() as $payload) { 
            if (\array_key_exists('customerTax', $payload)) { 
                $taxFreeBackport[] = $payload['id']; 
            } elseif (\array_key_exists('taxFree', $payload)) { 
                $taxFreePort[] = $payload['id']; 
            } 
 
            if (\array_key_exists('companyTax', $payload)) { 
                $companyTaxFreeBackport[] = $payload['id']; 
            } elseif (\array_key_exists('companyTaxFree', $payload)) { 
                $companyTaxFreePort[] = $payload['id']; 
            } 
        } 
 
        $this->port($taxFreePort, CountryDefinition::TYPE_CUSTOMER_TAX_FREE); 
        $this->port($companyTaxFreePort, CountryDefinition::TYPE_COMPANY_TAX_FREE); 
        $this->backport($taxFreeBackport, CountryDefinition::TYPE_CUSTOMER_TAX_FREE); 
        $this->backport($companyTaxFreeBackport, CountryDefinition::TYPE_COMPANY_TAX_FREE); 
    } 
 
    private function port(array $ids, string $taxFreeType): void 
    { 
        $ids = array_unique(array_filter($ids)); 
 
        if (empty($ids)) { 
            return; 
        } 
 
        $countries = $this->connection->fetchAllAssociative( 
            'SELECT id, tax_free, company_tax_free, customer_tax, company_tax FROM country WHERE id IN (:ids)', 
            ['ids' => Uuid::fromHexToBytesList($ids)], 
            ['ids' => Connection::PARAM_STR_ARRAY] 
        ); 
 
        if ($taxFreeType === CountryDefinition::TYPE_CUSTOMER_TAX_FREE) { 
            $query = 'UPDATE `country` 
                    SET `customer_tax` = JSON_OBJECT("enabled", :isTaxFree, "currencyId", :currencyId, "amount", :amount) 
                    WHERE id = :countryId;'; 
        } else { 
            $query = 'UPDATE `country` 
                    SET `company_tax` = JSON_OBJECT("enabled", :isTaxFree, "currencyId", :currencyId, "amount", :amount) 
                    WHERE id = :countryId;'; 
        } 
 
        $update = new RetryableQuery($this->connection, $this->connection->prepare($query)); 
 
        foreach ($countries as $country) { 
            if ($taxFreeType === CountryDefinition::TYPE_CUSTOMER_TAX_FREE) { 
                $tax = json_decode($country['customer_tax'], true); 
                $isTaxFree = $country['tax_free']; 
            } else { 
                $tax = json_decode($country['company_tax'], true); 
                $isTaxFree = $country['company_tax_free']; 
            } 
 
            if ((bool) $isTaxFree === (bool) $tax['enabled']) { 
                continue; 
            } 
 
            $update->execute([ 
                'countryId' => $country['id'], 
                'isTaxFree' => $isTaxFree, 
                'currencyId' => $tax['currencyId'], 
                'amount' => $tax['amount'], 
            ]); 
        } 
    } 
 
    private function backport(array $ids, string $taxFreeType): void 
    { 
        $ids = array_unique(array_filter($ids)); 
 
        if (empty($ids)) { 
            return; 
        } 
 
        $countries = $this->connection->fetchAllAssociative( 
            'SELECT id, tax_free, company_tax_free, customer_tax, company_tax FROM country WHERE id IN (:ids)', 
            ['ids' => Uuid::fromHexToBytesList($ids)], 
            ['ids' => Connection::PARAM_STR_ARRAY] 
        ); 
 
        if ($taxFreeType === CountryDefinition::TYPE_CUSTOMER_TAX_FREE) { 
            $query = 'UPDATE `country` SET `tax_free` = :isTaxFree WHERE id = :countryId;'; 
        } else { 
            $query = 'UPDATE `country` SET `company_tax_free` = :isTaxFree WHERE id = :countryId;'; 
        } 
 
        $update = new RetryableQuery($this->connection, $this->connection->prepare($query)); 
 
        foreach ($countries as $country) { 
            if ($taxFreeType === CountryDefinition::TYPE_CUSTOMER_TAX_FREE) { 
                $tax = json_decode($country['customer_tax'], true); 
                $isTaxFree = $country['tax_free']; 
            } else { 
                $tax = json_decode($country['company_tax'], true); 
                $isTaxFree = $country['company_tax_free']; 
            } 
 
            if ((bool) $isTaxFree === (bool) $tax['enabled']) { 
                continue; 
            } 
 
            $update->execute([ 
                'countryId' => $country['id'], 
                'isTaxFree' => $tax['enabled'], 
            ]); 
        } 
    } 
}