<?php 
 
namespace App\Service\App\Merchant\Invoice\Listener; 
 
use App\Repository\Merchant\Contract\IOrderRepository; 
use App\Service\App\Merchant\CustomFeature\Implementation\InvoiceCustomFeature; 
use App\Service\App\Merchant\Invoice\Contract\ICreateInvoiceByOrderIdService; 
use App\Service\App\Merchant\Invoice\Contract\IPayInvoiceService; 
use App\Service\App\Merchant\Payment\Event\ConfirmPaymentEvent; 
use App\Types\InvoiceStatus; 
 
class ConfirmPaymentListener 
{ 
 
    /** 
     * Create invoice service 
     * 
     * @var ICreateInvoiceByOrderIdService 
     */ 
    private ICreateInvoiceByOrderIdService $createInvoiceService; 
 
    /** 
     * Pay invoice service 
     * 
     * @var IPayInvoiceService 
     */ 
    private IPayInvoiceService $payInvoiceService; 
 
    /** 
     * Invoice custom feature instance 
     * 
     * @var InvoiceCustomFeature 
     */ 
    private InvoiceCustomFeature $invoiceCustomFeature; 
 
    /** 
     * Order repository 
     * 
     * @var IOrderRepository 
     */ 
    private IOrderRepository $orderRepository; 
 
    /** 
     * Constructor 
     * 
     * @param ICreateInvoiceByOrderIdService $createInvoiceService 
     * @param IPayInvoiceService $payInvoiceService 
     * @param InvoiceCustomFeature $invoiceCustomFeature 
     * @param IOrderRepository $orderRepository 
     */ 
    public function __construct( 
        ICreateInvoiceByOrderIdService $createInvoiceService, 
        IPayInvoiceService $payInvoiceService, 
        InvoiceCustomFeature $invoiceCustomFeature, 
        IOrderRepository $orderRepository 
    ) 
    { 
        $this->createInvoiceService = $createInvoiceService; 
        $this->payInvoiceService = $payInvoiceService; 
        $this->invoiceCustomFeature = $invoiceCustomFeature; 
        $this->orderRepository = $orderRepository; 
    } 
 
    /** 
     * Listen on confirm payment event 
     * 
     * @param ConfirmPaymentEvent $event 
     * @return void 
     */ 
    public function onAction(ConfirmPaymentEvent $event): void 
    { 
        if ($this->invoiceCustomFeature->isEnabled()) { 
            $order = $this->orderRepository->getOrder($event->getRequest()->getId()); 
            $invoice = $order->getInvoice(); 
            $reason = $event->getRequest()->getReason() ?? ''; 
            if ($invoice && $invoice->getStatus() != InvoiceStatus::STATUS_PAID) { 
                $this->payInvoiceService->perform($invoice->getId(), $reason); 
            } else if ($order->isAutoMakeInvoiceOnReceive()) { 
                // skip for 0 amount orders 
                if (!$order->getAmount()) { 
                    return; 
                } 
 
                $res = $this->createInvoiceService->perform($event->getRequest()->getId()); 
                $this->payInvoiceService->perform($res->getId(), $reason); 
            } 
        } 
    } 
 
}