<?php 

namespace TbiBank\FusionPay\Observer;

use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
use Magento\Sales\Api\OrderRepositoryInterface;
use Psr\Log\LoggerInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Store\Model\ScopeInterface;
use Magento\Sales\Model\Order;

use TbiBank\FusionPay\Model\TbiStatusUpdate;

class SetDefaultTbiStatus implements ObserverInterface
{
    protected $orderRepository;
    protected $logger;
    protected $scopeConfig;
    protected $tbiStatusUpdate;

    public function __construct(
        OrderRepositoryInterface $orderRepository,
        LoggerInterface $logger,
        ScopeConfigInterface $scopeConfig,
        TbiStatusUpdate $tbiStatusUpdate
    ) {
        $this->orderRepository = $orderRepository;
        $this->logger = $logger;
        $this->scopeConfig = $scopeConfig;
        $this->tbiStatusUpdate = $tbiStatusUpdate;
    }

    public function execute(Observer $observer)
    {
        $order = $observer->getEvent()->getOrder();

        // Only apply to FusionPay orders
        if ($order->getPayment()->getMethod() === 'fusionpay') {
            
            // Set default TBI status if not already set
            if (!$order->getData('tbi_status')) {
                $order->setData('tbi_status',  __( "In Progress" ));
            }
            
            // Apply the configured default order status
            $defaultOrderStatus = $this->scopeConfig->getValue(
                'payment/fusionpay/default_order_status',
                ScopeInterface::SCOPE_STORE
            );
            
            if ($defaultOrderStatus && $defaultOrderStatus !== '') {
                $order->setStatus($defaultOrderStatus);
                // Set appropriate state based on status
                if (in_array($defaultOrderStatus, ['pending', 'pending_payment'])) {
                    $order->setState(Order::STATE_PENDING_PAYMENT);
                } elseif (in_array($defaultOrderStatus, ['processing'])) {
                    $order->setState(Order::STATE_PROCESSING);
                } elseif (in_array($defaultOrderStatus, ['complete'])) {
                    $order->setState(Order::STATE_COMPLETE);
                } elseif (in_array($defaultOrderStatus, ['canceled'])) {
                    $order->setState(Order::STATE_CANCELED);
                } elseif (in_array($defaultOrderStatus, ['closed'])) {
                    $order->setState(Order::STATE_CLOSED);
                } else {
                    $order->setState(Order::STATE_NEW);
                }
            }
            
            // Save order
            $this->orderRepository->save($order);

            // Keep the denormalized order grid column in sync with the canonical value
            $this->tbiStatusUpdate->updateStatus($order->getIncrementId(), $order->getData('tbi_status'));

            //$this->logger->info("Set default TBI Status for Order ID: " . $order->getId());
        }
    }
}
