<?php
/**
 * Copyright © 2018 EaDesign by Eco Active S.R.L. All rights reserved.
 * See LICENSE for license details.
 */

namespace Eadesigndev\Urgent\Controller\Adminhtml\Index;

use Eadesigndev\Awb\Model\Awb;
use Eadesigndev\Awb\Model\AwbFactory;
use Eadesigndev\Awb\Model\AwbRepository;
use Eadesigndev\Urgent\Model\ShipmentData;
use Eadesigndev\Urgent\Model\GenerateAwb;
use Eadesigndev\Awb\Controller\Adminhtml\Index\Index;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\App\Request\Http;
use Magento\Backend\Model\View\Result\Redirect;
use Magento\Framework\Controller\ResultInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\App\Request\DataPersistorInterface;

#[\AllowDynamicProperties]
class Aprove extends Action
{
    const ADMIN_RESOURCE = 'Eadesigndev_Urgent::urgent';

    private $dataPersistor;

    private $awbRepository;

    private $request;

    private $awbFactory;

    public $generateAwb;

    private $shipmentData;


    public function __construct(
        Context $context,
        DataPersistorInterface $dataPersistor,
        AwbRepository $awbRepository,
        AwbFactory $awbFactory,
        GenerateAwb $generateAwb,
        Http $request,
        ShipmentData $shipmentData
    ) {
        $this->dataPersistor = $dataPersistor;
        $this->awbRepository = $awbRepository;
        $this->awbFactory = $awbFactory;
        $this->generateAwb = $generateAwb;
        $this->request = $request;
        $this->shipmentData = $shipmentData;

        parent::__construct($context);
    }

    /**
     * Aprove Awb action
     *
     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
     * @return ResultInterface
     */
    public function execute()
    {
        /** @var Redirect $resultRedirect */
        $resultRedirect = $this->resultRedirectFactory->create();

        $idAwb = $this->getRequest()->getParam('entity_id');
        if ($idAwb) {
            /** @var Awb $model */
            $model = $this->awbRepository->getById($idAwb);
        } else {
            /** @var Awb $model */
            $model = $this->awbFactory->create();

            $request = $this->getRequest();

            $postValue = $request->getPostValue();

            $data = $postValue;

            $model->setData($data);
        }

        $this->generateAwb->setGenerateAwb($idAwb);

        $data = $this->generateAwb->generateAwb($idAwb);

        $model->setData($data);

        $model->setData('update_time', time());

        try {
            $this->awbRepository->save($model);
            $this->messageManager->addSuccessMessage(__('You saved awb.'));
            $this->dataPersistor->clear('awb_data');
            if ($this->getRequest()->getParam('back')) {
                return $resultRedirect
                    ->setPath('*/*/edit', ['entity_id' => $model->getId(), '_current' => true]);
            }
            return $resultRedirect->setPath('*/*/');
        } catch (LocalizedException $e) {
            $this->messageManager->addErrorMessage($e->getMessage());
        } catch (\Exception $e) {
            $this->messageManager->addExceptionMessage(
                $e,
                __('Something went wrong while aprove the Awb.')
            );
        }

        $this->dataPersistor->set('awb_data', $data);
        return $resultRedirect
            ->setPath('*/*/edit', ['entity_id' => $this->getRequest()->getParam('entity_id')]);

        return $resultRedirect->setPath('*/*/');
    }

    /**
     * Check the permission to run it
     *
     * @return boolean
     */
    //@codingStandardsIgnoreLine
    protected function _isAllowed()
    {
        return $this->_authorization->isAllowed(Index::ADMIN_RESOURCE);
    }
}
