<?php
/**
 * Copyright © 2018 EaDesign by Eco Active S.R.L. All rights reserved.
 * See LICENSE for license details.
 */

namespace Eadesigndev\Awb\Controller\Adminhtml\Index;

use Eadesigndev\Awb\Api\AwbRepositoryInterface;
use Eadesigndev\Awb\Model\AwbFactory;
use Eadesigndev\Awb\Model\AwbRepository;
use Eadesigndev\Awb\Model\Sources\CarrierType;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;

use Eadesigndev\Urgent\Model\GenerateAwb as GenerateAwbUrgent;
use Eadesigndev\FanCourier\Model\GenerateAwb as GenerateAwbFan;
use Eadesigndev\DPD\Model\GenerateAwb as GenerateAwbDPD;
use Eadesigndev\GLS\Model\GenerateAwb as GenerateAwbGLS;
use Eadesigndev\DragonStar\Model\GenerateAwb as GenerateAwbDragonStar;
use Eadesigndev\xCurier\Model\GenerateAwb as GenerateAwbXCurier;
use Eadesigndev\NemoExpress\Model\GenerateAwb as GenerateAwbNemoExpress;
use Eadesigndev\Sameday\Model\GenerateAwb as GenerateAwbSameday;

#[\AllowDynamicProperties]
class Delete extends Action
{
    const ACTION = 'Eadesigndev_Awb::awb';

    public $resultFactory;

    private $awbRepository;

    private $awbFactory;

    public function __construct(
        Context $context,
        PageFactory $resultFactory,
        AwbRepositoryInterface $awbRepository,
        AwbFactory $awbFactory,
        GenerateAwbUrgent $generateAwbUrgent,
        GenerateAwbFan $generateAwbFanCourier,
        GenerateAwbDPD $generateAwbDPD,
        GenerateAwbGLS $generateAwbGLS,
        GenerateAwbDragonStar $generateAwbDragonStar,
        GenerateAwbXCurier $generateAwbXCurier,
        GenerateAwbNemoExpress $generateAwbNemoExpress,
        GenerateAwbSameday $generateSameday
    ) {
        $this->resultFactory    = $resultFactory;
        $this->awbRepository    = $awbRepository;
        $this->awbFactory       = $awbFactory;

        $this->generateAwbUrgent   = $generateAwbUrgent;
        $this->generateAwbFanCourier   = $generateAwbFanCourier;
        $this->generateAwbDPD   = $generateAwbDPD;
        $this->generateAwbGLS   = $generateAwbGLS;
        $this->generateAwbDragonStar = $generateAwbDragonStar;
        $this->generateAwbXCurier = $generateAwbXCurier;
        $this->generateAwbNemoExpress = $generateAwbNemoExpress;
        $this->generateSameday = $generateSameday;

        parent::__construct($context);
    }
    public function execute()
    {
        $id = $this->getRequest()->getParam('entity_id');
        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
        $resultRedirect = $this->resultRedirectFactory->create();
        if ($id) {
            try {
                /** @var AwbRepository $awb */
                $model = $this->awbRepository->getById($id);
                $carrierId = $model->getData('carrier_id');
                $awbNumber = $model->getData('awb_number');

                if ($this->callApiDelete($carrierId, $awbNumber)) {
                    $this->awbRepository->saveAndDeleteById($id);
                    $this->messageManager->addSuccessMessage(__('The awb has been deleted.'));
                }
                return $resultRedirect->setPath('*/*/');
            } catch (\Exception $e) {
                $this->messageManager->addErrorMessage($e->getMessage());
                return $resultRedirect->setPath('*/*/');
            }
        }
        $this->messageManager->addErrorMessage(__('We can\'t find a page to delete.'));
        return $resultRedirect->setPath('*/*/');
    }
    /**
     * @return bool
     */
    protected function _isAllowed()
    {
        return $this->_authorization->isAllowed(self::ACTION);
    }

    public function callApiDelete($carrierId, $awbNumber)
    {
        switch ($carrierId)
        {
            case CarrierType::URGENT_CURRIER:
                $carrierConnector = $this->generateAwbUrgent;
                break;
            case CarrierType::FAN_CURRIER:
                $carrierConnector = $this->generateAwbFanCourier;
                break;
            case CarrierType::DPD:
                $carrierConnector = $this->generateAwbDPD;
                break;
            case CarrierType::GLS:
                $carrierConnector = $this->generateAwbGLS;
                break;
            case CarrierType::DRAGON_STAR:
                $carrierConnector = $this->generateAwbDragonStar;
                break;
            case CarrierType::X_CURIER:
                $carrierConnector = $this->generateAwbXCurier;
                break;
            case CarrierType::NEMO_EXPRESS:
                $carrierConnector = $this->generateAwbNemoExpress;
                break;
            case CarrierType::SAMEDAY:
                $carrierConnector = $this->generateSameday;
                break;
        }

        if (empty($carrierConnector)) {
            return false;
        }

        if (method_exists($carrierConnector, 'deleteAwb')) {
            return $carrierConnector->deleteAwb($awbNumber);
        } else {
            die(__('There is no delete method for %s', CarrierType::getAvailableStatic()[$carrierId]));
        }
    }
}