<?php
/**
 * Copyright ©  All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Leadlion\AutogedalWarehouses\Observer\Sales;
use Magento\Framework\App\State;
use Magento\Framework\App\Area;
use Magento\Framework\App\RequestInterface;

class OrderSaveBefore implements \Magento\Framework\Event\ObserverInterface
{
    protected $state;
    protected $quoteFactory;
    protected $scopeConfig;
    protected $productCollectionFactory;
    protected $warehouseBlock;
    public $request;

    public function __construct(
        \Magento\Quote\Model\QuoteFactory $quoteFactory,
        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
        \Leadlion\AutogedalWarehouses\Block\Warehouse $warehouseBlock,
        State $state,
        RequestInterface $request
    ){
        $this->state = $state;
        $this->quoteFactory = $quoteFactory;
        $this->scopeConfig = $scopeConfig;
        $this->productCollectionFactory = $productCollectionFactory;
        $this->warehouseBlock = $warehouseBlock;
        $this->request = $request;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        try {
            $areaCode = $this->state->getAreaCode();
        } catch (LocalizedException $exception) {
            $areaCode = null;
        }
        $order = $observer->getOrder();
        $quote = $observer->getQuote();
        
        $defultWarehouse = $this->scopeConfig->getValue('warehouse/autogedal_warehouse/warehouse_option', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);
        $defultCarrier = $this->scopeConfig->getValue('warehouse/autogedal_warehouse/carrier_option', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);
        $orderProductId = ''; $productWarehouse ='';

        $quoteId = $quote->getEntityId();
        $params = $this->request->getParams();
        if ($areaCode == Area::AREA_FRONTEND || $areaCode == Area::AREA_WEBAPI_REST) {
            $warehouseData = $this->warehouseBlock->getProductWarehouse($quoteId);
            if (isset($warehouseData)) {
                $order->setData('autogedal_allocated_warehouse', $warehouseData['warehouse']);
                $order->setData('autogedal_allocated_carrier', $warehouseData['carrier']);
            }
        } else {
            $data = $this->request->getParams();
            if (isset($data['order']['autogedal_warehouse_allocation']) && $data['order']['autogedal_warehouse_allocation'] != '') {
                $order->setData('autogedal_allocated_warehouse', $data['order']['autogedal_warehouse_allocation']);
            } elseif (!empty($quote->getData('autogedal_allocated_warehouse')) && empty($order->getData('autogedal_allocated_warehouse'))) {
                $order->setData('autogedal_allocated_warehouse', $quote->getData('autogedal_allocated_warehouse'));
            } else {
                $warehouseData = $this->warehouseBlock->getProductWarehouse($quoteId);
                $order->setData('autogedal_allocated_warehouse', $warehouseData['warehouse']);
            }

            if (isset($data['order']['autogedal_carrier_allocation']) && $data['order']['autogedal_carrier_allocation'] != '') {
                $order->setData('autogedal_allocated_carrier', $data['order']['autogedal_carrier_allocation']);
            } else if (!empty($quote->getData('autogedal_allocated_carrier')) && empty($order->getData('autogedal_allocated_carrier'))) {
                $order->setData('autogedal_allocated_carrier', $quote->getData('autogedal_allocated_carrier'));
            } else {
                $warehouseData = $this->warehouseBlock->getProductWarehouse($quoteId);
                $order->setData('autogedal_allocated_carrier', $warehouseData['carrier']);
            }
        }
        return $order;
    }
}