<?php
namespace Leadlion\AutogedalWarehouses\Block;

use Magento\Framework\View\Element\Template;

class Warehouse extends \Magento\Framework\View\Element\Template
{
    const ORDER_WAREHOUSE_KEY = "autogedal_allocated_warehouse";
    const ORDER_CARRIER_KEY = "autogedal_allocated_carrier";
    const ORDER_PACKAGES_NUMBER = "packages_number";
    const ADMIN_ROLE_ID = 1;

    public $objectManager;
    protected $orderSources;
    protected $orderRepo;
    protected $courier;
    protected $productRepository;
    protected $productCollectionFactory;
    protected $scopeConfig;
    protected $warehouseRepository;
    protected $warehouseCollectionFactory;
    protected $request;
    protected $adminQuoteSession;
    protected $quoteFactory;

    public function __construct(
        Template\Context $context,
        \Leadlion\AutogedalWarehouses\Model\Product\Attribute\Source\AutogedalWarehouse $orderwarehouse,
        \Magento\Sales\Api\OrderRepositoryInterface $orderRepo,
        \Leadlion\AutogedalWarehouses\Model\Warehouse $warehouseModel,
        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
        \Magento\Catalog\Model\ProductRepository $productRepository,
        \Leadlion\AutogedalWarehouses\Model\WarehouseRepository $warehouseRepository,
        \Leadlion\AutogedalWarehouses\Model\ResourceModel\Warehouse\CollectionFactory $warehouseCollectionFactory,
        \Magento\Backend\Model\Session\Quote $adminQuoteSession,
        \Magento\Quote\Model\QuoteFactory $quoteFactory,
        \Magento\Framework\App\Request\Http $request,
        array $data = []
    )
    {
        parent::__construct($context, $data);
        $this->objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $this->orderwarehouse = $orderwarehouse;
        $this->orderRepo = $orderRepo;
        $this->warehouseModel = $warehouseModel;
        $this->productRepository = $productRepository;
        $this->productCollectionFactory = $productCollectionFactory;
        $this->scopeConfig = $scopeConfig;
        $this->warehouseRepository = $warehouseRepository;
        $this->warehouseCollectionFactory = $warehouseCollectionFactory;
        $this->request = $request;
        $this->quoteFactory = $quoteFactory;
        $this->adminQuoteSession = $adminQuoteSession;
    }

    public function getWarehousesByCarrierAjaxUrl()
    {
        return $this->getUrl("autogedalwarehouses/warehouse/showwarehouses");
    }

    public function getAjaxUrl()
    {
        return $this->getUrl("autogedalwarehouses/warehouse/ordersave");
    }

    public function getOrderCarrier()
    {
        return $this->warehouseModel->getAvailableStatic();
    }

    public function getOrderWarehousee()
    {
        return $this->orderwarehouse->toOptionArray();
    }

    public function getSelectedOptions()
    {
        $orderId = $this->getOrderId();
        $result = [];
        if (!empty($orderId)) {
            $orderObject = $this->orderRepo->get($orderId);

            $result = [
                "warehouse" => $orderObject->getData(self::ORDER_WAREHOUSE_KEY),
                "carrier" => $orderObject->getData(self::ORDER_CARRIER_KEY),
                "packages_number" => $orderObject->getData(self::ORDER_PACKAGES_NUMBER),
            ];
        }
        return $result;
    }

    public function getOrderId()
    {
        $orderId = $this->getRequest()->getParam('order_id');

        if (!empty($orderId)) {
            return $orderId;
        } else {
            $reordered = $this->adminQuoteSession->getReordered();
            if (!empty($reordered)) {
                return $reordered;
            }
            return $this->adminQuoteSession->getOrder()->getEntityId();
        }
    }

    public function checkAccess()
    {
        $result = false;
        $orderId = $this->getOrderId();
        if ($this->request->getControllerName() == 'order_create' || $this->request->getControllerName() == 'order_edit') {
            $result = true;
        }
        return $result;
    }

    public function getProductWarehouse($quoteId)
    {
        $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);
        $productIds = []; $orderProductId = ''; $productWarehouse = ''; $ruleWarehouse = ''; $productCarrier = '';

        if ($quoteId != '') {
            $quote = $this->quoteFactory->create()->load($quoteId);
            foreach ($quote->getAllVisibleItems() as $item) {
                $productIds[] = $item->getProductId();
            }
        } else if($this->getOrderId() != '') {
            $orderId = $this->getOrderId();
            $orderObject = $this->orderRepo->get($orderId);
            foreach($orderObject->getAllVisibleItems() as $orderItem) {
                $productIds[] = $orderItem->getProductId();
            }
        }

        if (count($productIds) > 0) {
            foreach($productIds as $pid) {
                $productWarehouse = $this->getWarehouseProductCollection($pid);
                if ($productWarehouse != '') {
                    $productWarehouse = $productWarehouse;
                    $productCarrier = $this->getCarrier($productWarehouse);
                } else {
                    if (!empty($pid)) {
                        $ruleWarehouse = $this->checkCondition($pid);
                    }
                    if (!empty($ruleWarehouse)) {
                        $productWarehouse = $ruleWarehouse->getWarehouseId();
                        $productCarrier = $ruleWarehouse->getDefaultCourier();
                    }
                }
                if ($productWarehouse != '') {
                    break;
                }
            }
            if ($productWarehouse == '') {
                $productWarehouse = $defultWarehouse;
                $productCarrier = $defultCarrier;
            }
        }
        
        $result = [
            "warehouse" => $productWarehouse,
            "carrier" => $productCarrier,
        ];
        return $result;
    }

    public function getCarrier($warehouseId) {
        $warehouseObject = $this->warehouseModel->load($warehouseId);
        return $warehouseObject->getDefaultCourier();
    }

    public function checkCondition($productId)
    {
        $prdData = $this->productRepository->getById($productId);
        $ruleColl = $this->warehouseCollectionFactory->create();
        $ruleData = '';
        foreach ($ruleColl as $ruleKey => $ruleVal) {
            if ($ruleVal->getConditions()->getConditions()) {
                if ($ruleVal->getConditions()->validate($prdData)) {
                    $ruleData = $ruleVal;
                }
            }
        }
        return $ruleData;
    }

    public function getCurrentUrlInfo() {
        $actions['contoller'] = $this->request->getControllerName();
        $actions['action'] = $this->request->getActionName();
        return $actions;
    }

    public function getWarehouseProductCollection($pid) {
        $collection = $this->productCollectionFactory->create();
        $collection->addAttributeToSelect(['name','sku','autogedal_warehouse']);
        $collection->addAttributeToFilter('autogedal_warehouse',  ['notnull' => true]);
        $collection->addAttributeToFilter('entity_id', $pid);

        $pWarehouse = '';
        if (count($collection) > 0) {
            foreach ($collection as $product) {
                $pWarehouse = $product->getAutogedalWarehouse();
            }
        }
        return $pWarehouse;
    }
}