<?php

namespace Netopia\Netcard\Controller\Payment;

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\View\Result\PageFactory;
use Magento\Sales\Model\Order;
use Magento\Checkout\Model\Session;
use Magento\Sales\Model\OrderFactory;
use Magento\Sales\Api\OrderRepositoryInterface;
use Psr\Log\LoggerInterface;

class Redirect extends Action {
    /**
     * @var PageFactory
     */
    private $pageFactory;

    /**
     * @var Session
     */
    protected $_checkoutSession;

    /**
     * @var ScopeConfigInterface
     */
    private $scopeConfig;

    /**
     * @var OrderFactory
     */
    private $orderFactory;

    /**
     * @var OrderRepositoryInterface
     */
    private $orderRepository;

    /**
     * @var LoggerInterface
     */
    private $logger;

    /**
     * Constructor
     *
     * @param Context $context
     * @param PageFactory $pageFactory
     * @param Session $checkoutSession
     * @param ScopeConfigInterface $scopeConfig
     * @param OrderFactory $orderFactory
     * @param OrderRepositoryInterface $orderRepository
     * @param LoggerInterface $logger
     */
    public function __construct(
        Context $context,
        PageFactory $pageFactory,
        Session $checkoutSession,
        ScopeConfigInterface $scopeConfig,
        OrderFactory $orderFactory,
        OrderRepositoryInterface $orderRepository,
        LoggerInterface $logger
    ) {
        parent::__construct($context);
        $this->pageFactory = $pageFactory;
        $this->_checkoutSession = $checkoutSession;
        $this->scopeConfig = $scopeConfig;
        $this->orderFactory = $orderFactory;
        $this->orderRepository = $orderRepository;
        $this->logger = $logger;
    }

    /**
     * Execute view action
     *
     * @return \Magento\Framework\Controller\ResultInterface|\Magento\Framework\App\ResponseInterface
     */
    public function execute()
    {
        try {
            $incrementId = $this->_checkoutSession->getLastRealOrderId();

            if (!$incrementId) {
                return $this->_redirect('checkout/cart');
            }

            $order = $this->orderFactory->create()->loadByIncrementId($incrementId);

            if (!$order->getId()) {
                return $this->_redirect('checkout/cart');
            }

            $orderStatus = $this->scopeConfig->getValue('payment/net_card/order_status');

            $statuses = $order->getConfig()->getStateStatuses('pending', false);

            $orderState = in_array($orderStatus, $statuses, true)
                ? 'pending'
                : Order::STATE_PENDING_PAYMENT;

            $order->setState($orderState)->setStatus($orderStatus);

            $this->orderRepository->save($order);

            return $this->pageFactory->create();

        } catch (\Exception $e) {
            $this->logger->critical('Netopia Redirect Error: ' . $e->getMessage());
            return $this->_redirect('checkout/cart');
        }
    }
}
