<?php 
 
namespace App\Service\App\Merchant\Integrations\Zapier\Listener; 
 
use App\Background\Data\ZapierTriggerPaymentData; 
use App\Core\BackgroundWork\Contract\IClient; 
use App\Core\MerchantSelector\Contract\IMerchantSelector; 
use App\Service\App\Merchant\CustomFeature\Implementation\ZapierCustomFeature; 
use App\Service\App\Merchant\Integrations\Logger\IntegrationLoggerProcessor; 
use App\Service\App\Merchant\Payment\Event\CreatePaymentEvent; 
use App\Types\ZapierTriggerTypes; 
use Psr\Log\LoggerInterface; 
 
class CreatePaymentListener 
{ 
    /** 
     * Background job client 
     * 
     * @var IClient 
     */ 
    private IClient $backgroundClient; 
 
    /** 
     * Merchant selector 
     * 
     * @var IMerchantSelector 
     */ 
    private IMerchantSelector $merchantSelector; 
 
    /** 
     * Zapier custom feature 
     * 
     * @var ZapierCustomFeature 
     */ 
    private ZapierCustomFeature $zapierCustomFeature; 
 
    /** 
     * Logger interface 
     * 
     * @var LoggerInterface 
     */ 
    private LoggerInterface $logger; 
 
    /** 
     * Integration logger processor 
     * 
     * @var IntegrationLoggerProcessor 
     */ 
    private IntegrationLoggerProcessor $loggerProcessor; 
 
    /** 
     * @param IClient $backgroundClient 
     * @param IMerchantSelector $merchantSelector 
     * @param ZapierCustomFeature $zapierCustomFeature 
     * @param LoggerInterface $logger 
     * @param IntegrationLoggerProcessor $loggerProcessor 
     */ 
    public function __construct( 
        IClient $backgroundClient, IMerchantSelector $merchantSelector, ZapierCustomFeature $zapierCustomFeature, 
        LoggerInterface $logger, IntegrationLoggerProcessor $loggerProcessor 
    ) 
    { 
        $this->backgroundClient = $backgroundClient; 
        $this->merchantSelector = $merchantSelector; 
        $this->zapierCustomFeature = $zapierCustomFeature; 
        $this->logger = $logger; 
        $this->loggerProcessor = $loggerProcessor; 
    } 
 
    /** 
     * @param CreatePaymentEvent $event 
     * @return void 
     */ 
    public function onAction(CreatePaymentEvent $event): void 
    { 
        if (!$this->zapierCustomFeature->isEnabled()) { 
            return; 
        } 
 
        // @todo remove after testing 
        $this->loggerProcessor->setInfo($event->getOrderId(), ZapierCustomFeature::NAME); 
        $this->logger->info('Zapier: Triggering payment created event for the order ' . $event->getOrderId()); 
 
        $this->backgroundClient->runJob( 
            new ZapierTriggerPaymentData( 
                $event->getOrderId(), $this->merchantSelector->getMerchant(), 
                ZapierTriggerTypes::TYPE_PAYMENT_CREATED 
            ) 
        ); 
    } 
 
}