<?php

namespace Leadlion\AutogedalOrderFlow\Plugin;

use Magento\Checkout\Model\Session;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\App\State;
use Magento\Framework\Exception\LocalizedException;
use Magento\Sales\Model\Order;
use Magento\Framework\App\Area;

class SalesOrderPlace
{
    protected $state;
    protected $orderRepository;
    protected $scopeConfig;
    protected $statusFactory;
	protected $request;

    public function __construct(
        State $state,
        \Magento\Sales\Api\OrderRepositoryInterface $orderRepository,
        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
        \Magento\Sales\Model\Order\StatusFactory $statusFactory,
		\Magento\Framework\App\Request\Http $request,
        private readonly Session $checkoutSession
    ) {
        $this->state = $state;
        $this->orderRepository = $orderRepository;
        $this->scopeConfig = $scopeConfig;
        $this->statusFactory = $statusFactory;
		$this->request = $request;
    }
    public function aroundPlace(\Magento\Sales\Model\Service\OrderService $subject, \Closure $proceed,  \Magento\Sales\Api\Data\OrderInterface $order)
    {
		$data = $this->request->getPost();

        $return = $proceed($order);
        $orderId = $order->getEntityId();
        $orderComment = '';

        $orderStatusFrontend = $this->scopeConfig->getValue('orderflow/order_status/frontend_pending_status', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);
        $orderStatusBackend = $this->scopeConfig->getValue('orderflow/order_status/backend_pending_status', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);
        $orderSource = $this->scopeConfig->getValue('orderflow/order_source/frontend_source', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);
        $payment = $order->getPayment();
        $paymentMethod = $payment->getMethodInstance();
        if(in_array($paymentMethod->getCode(), ['cardcc', 'net_card'])){
            $orderStatusFrontend = $paymentMethod->getConfigData('order_status');
        }
        if ($paymentMethod->getCode() === 'leanpay') {
            $orderStatusFrontend = 'leanpay_pending';
        }
        try {
            $areaCode = $this->state->getAreaCode();
        } catch (LocalizedException $exception) {
            $areaCode = null;
        }
        $orderObj = $this->orderRepository->get($orderId);

        if ($areaCode == Area::AREA_FRONTEND || $areaCode == Area::AREA_WEBAPI_REST) {
            $orderObj->setAutogedalOrderSource($orderSource);
            $this->orderRepository->save($orderObj);
        }
        if (isset($data['order']['comment'])) {
            $orderComment = $data['order']['comment']['customer_note'];
        }
		if(isset($data['order']['order_status']) && $data['order']['order_status'] != ''){
            // status chosen by operator
			$orderObj->setData('status', $data['order']['order_status'])->setData('state', 'pending');
			$orderObj->addStatusToHistory($data['order']['order_status'], __('Order status') .' '.$orderComment, $notified = false);
			$this->orderRepository->save($orderObj);
		} else {
            if ($orderObj->getAutogedalOrderSource() == $orderSource ||
                $areaCode == Area::AREA_CRONTAB
            ) {
                //FE put in "$orderStatusFrontend"
				$orderObj->setData('status', $orderStatusFrontend)->setData('state', 'pending');
				$orderObj->addStatusToHistory($orderObj->getStatus(), __('Order status'), $notified = false);
				$this->orderRepository->save($orderObj);
			} else {
                //BE put in "PRELUATA" status
				$orderObj->setData('status', $orderStatusBackend)->setData('state', 'pending');
				$orderObj->addStatusToHistory($orderObj->getStatus(), __('Order status') .' '.$orderComment, $notified = false);
				$this->orderRepository->save($orderObj);
			}
		}

        if ($order->getPayment()->getMethod() === 'net_card') {
            $this->checkoutSession->setData('mobilpay_order_id', $order->getEntityId());
        }

        return $return;
    }
}
