<?php

namespace Autogedal\TbiBank\Plugin;

use Autogedal\TbiBank\Model\ApprovalAccounting;
use Autogedal\TbiBank\Model\ApprovalConfig;
use Autogedal\TbiBank\Model\PaymentMethod;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Sales\Model\Service\OrderService;

/** Restore the TBI waiting status after generic order-flow plugins have saved the order. */
class OrderFlowStatus
{
    public function __construct(private OrderRepositoryInterface $orderRepository)
    {
    }

    public function aroundPlace(
        OrderService $subject,
        callable $proceed,
        OrderInterface $order
    ): OrderInterface {
        $result = $proceed($order);
        $placedOrder = $this->orderRepository->get((int) $result->getEntityId());
        $payment = $placedOrder->getPayment();

        if (!$payment
            || $payment->getMethod() !== PaymentMethod::CODE
            || $payment->getAdditionalInformation(ApprovalAccounting::MARKER)
        ) {
            return $result;
        }

        if ($placedOrder->getState() !== ApprovalConfig::ORDER_STATE
            || $placedOrder->getStatus() !== ApprovalConfig::WAITING_STATUS
        ) {
            $placedOrder->setState(ApprovalConfig::ORDER_STATE)
                ->setStatus(ApprovalConfig::WAITING_STATUS)
                ->setIsInProcess(false);
            $this->orderRepository->save($placedOrder);
        }

        return $result;
    }
}
