<?php

namespace Leadlion\SalesOrder\Controller\Adminhtml\Items;

use Exception;
use Magento\Backend\App\Action\Context;
use Magento\Backend\Model\Session;
use Magento\Backend\Model\View\Result\ForwardFactory;
use Magento\Catalog\Helper\Product;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\Controller\Result\Raw;
use Magento\Framework\Controller\Result\RawFactory;
use Magento\Framework\Controller\Result\Redirect;
use Magento\Framework\Controller\ResultInterface;
use Magento\Framework\Escaper;
use Magento\Framework\View\Result\Page;
use Magento\Framework\View\Result\PageFactory;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Sales\Controller\Adminhtml\Order\Create;

/**
 * Class LoadBlock
 * @package Mageplaza\EditOrder\Block\Adminhtml\Items
 */
class LoadBlock extends \Mageplaza\EditOrder\Controller\Adminhtml\Items\LoadBlock
{
    const ADMIN_ROLE_ID = 1;

    
    /**
     * @var RawFactory
     */
    protected $resultRawFactory;

    /**
     * @var OrderRepositoryInterface
     */
    protected $orderRepository;
    protected $authSession;

    /**
     * LoadBlock constructor.
     * @param Context $context
     * @param Product $productHelper
     * @param Escaper $escaper
     * @param PageFactory $resultPageFactory
     * @param ForwardFactory $resultForwardFactory
     * @param RawFactory $resultRawFactory
     * @param OrderRepositoryInterface $orderRepository
     */
    public function __construct(
        Context $context,
        Product $productHelper,
        Escaper $escaper,
        PageFactory $resultPageFactory,
        ForwardFactory $resultForwardFactory,
        RawFactory $resultRawFactory,
        OrderRepositoryInterface $orderRepository,
        \Magento\Backend\Model\Auth\Session $authSession
    ) {
        $this->resultRawFactory = $resultRawFactory;
        $this->orderRepository  = $orderRepository;
        $this->authSession = $authSession;
        parent::__construct(
            $context,
            $productHelper,
            $escaper,
            $resultPageFactory,
            $resultForwardFactory,
            $resultRawFactory,
            $orderRepository
        );
    }

    /**
     * Loading page block
     *
     * @return ResponseInterface|Raw|Redirect|ResultInterface
     */
    public function execute()
    {
        $request = $this->getRequest();
        
        try {
            $userRole = $this->authSession->getUser()->getRole();
            if ($userRole->getRoleId() != self::ADMIN_ROLE_ID) {
                $items = $request->getParam('item');
                if ($items) {
                    foreach ($items as $id => $info) {
                        if (isset($info['discount_type']) &&
                            isset($info['discount_value'])
                        ) {
                            if ($info['discount_type'] == 'percent') {
                                if ($info['discount_value'] > 10) {
                                    throw new Exception('Discount-ul nu poate depasi 10%');
                                }
                            }
    
                            if ($info['discount_type'] == 'fixed') {
                                if (isset($info['custom_price'])) {
                                    $percentage = ($info['discount_value'] / $info['custom_price']) * 100;
                                    if ($percentage > 10) {
                                        throw new Exception('Discount-ul nu poate depasi 10%');
                                    }
                                } else {
                                    $percentage = ($info['discount_value'] / $info['price']) * 100;
                                    if ($percentage > 10) {
                                        throw new Exception('Discount-ul nu poate depasi 10%');
                                    }
                                }
                            }
                        }
                    }
                }
            }
            $this->_initSession()->_processData();
            $this->messageManager->addSuccessMessage('Totalurile au fost updatate.');
        } catch (Exception $e) {
            $this->_reloadQuote();
            $this->messageManager->addExceptionMessage($e, $e->getMessage());
        }

        $asJson = $request->getParam('json');

        /** @var Page $resultPage */
        $resultPage = $this->resultPageFactory->create();

        if ($asJson) {
            $resultPage->addHandle('sales_order_create_load_block_json');
        } else {
            $resultPage->addHandle('sales_order_create_load_block_plain');
        }

        $resultPage->addHandle('mpeditorder_load_block_items');
        $resultPage->addHandle('mpeditorder_load_block_message');

        $result = $resultPage->getLayout()->renderElement('content');

        if ($request->getParam('as_js_varname')) {
            $this->_objectManager->get(Session::class)->setUpdateResult($result);
            return $this->resultRedirectFactory->create()->setPath('sales/order_edit/showUpdateResult');
        }

        return $this->resultRawFactory->create()->setContents($result);
    }
}
