<?php

namespace Leadlion\SalesOrder\Helper;

use Eadesigndev\Awb\Model\Sources\CarrierType;
use Magento\Framework\Controller\ResultFactory;
use Magento\Backend\App\Action\Context;
use Magento\Ui\Component\MassAction\Filter;
use Magento\Backend\App\Action;
use Magento\Framework\Exception\LocalizedException;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory as SalesCollectionFactory;
use Leadlion\SalesOrder\Model\Config;
use Magento\Framework\App\Area;
use Magento\Sales\Model\Order;
use Magento\Backend\Model\View\Result\Redirect;
use Magento\Framework\App\Response\Http\FileFactory;
use SmartBill\Integration\Model\ResourceModel\Invoice\CollectionFactory as InvoiceCollectionFactory;
use Eadesigndev\Awb\Model\ResourceModel\Collection\CollectionFactory as AwbCollectionFactory;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Framework\Filesystem;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Framework\App\RequestInterface;
use Eadesigndev\Urgent\Model\Carrier\Carrier as ConnectUrgent;
use Eadesigndev\FanCourier\Helper\Data as ConnectFanCourier;
use Eadesigndev\GLS\Helper\Data as ConnectGLS;
use Eadesigndev\DPD\Helper\Data as ConnectDPD;
use Eadesigndev\DragonStar\Helper\Api as ConnectDragonStar;
use Eadesigndev\NemoExpress\Helper\Data as ConnectNemoExpress;
use Eadesigndev\Awb\Model\AwbRepository;

class AwbHelper
{

    /**
     * @var SalesCollectionFactory
     */
    private $salesCollectionFactory;
    /**
     * @var FileFactory
     */
    private $fileFactory;
    /**
     * @var StoreManagerInterface
     */
    private $storeManager;
    /**
     * @var InvoiceCollectionFactory
     */
    private $invoiceCollectionFactory;
    /**
     * @var Filesystem
     */
    private $filesystem;
    /**
     * @var \Magento\Framework\App\Filesystem\DirectoryList
     */
    private $directory;
    /**
     * @var OrderRepositoryInterface
     */
    private $orderRespository;
    /**
     * @var CarrierType
     */
    private $carrierType;
    /**
     * @var ConnectUrgent
     */
    private $connectUrgent;
    /**
     * @var ConnectFanCourier
     */
    private $connectFanCourier;
    /**
     * @var ConnectGLS
     */
    private $connectGLS;
    /**
     * @var ConnectDPD
     */
    private $connectDPD;
    /**
     * @var ConnectDragonStar
     */
    private $connectDragonStar;
    /**
     * @var ConnectNemoExpress
     */
    private $connectNemoExpress;
    /**
     * @var RequestInterface
     */
    private $request;
    /**
     * @var AwbRepository
     */
    private $awbRepository;
    /**
     * @var AwbCollectionFactory
     */
    private $awbCollectionFactory;

    private $awbFilesPathArray = [];


    protected $carrierConnector;

    public function __construct(
        SalesCollectionFactory $salesCollectionFactory,
        FileFactory $fileFactory,
        StoreManagerInterface $storeManager,
        InvoiceCollectionFactory $invoiceCollectionFactory,
        Filesystem $filesystem,
        \Magento\Framework\App\Filesystem\DirectoryList $directory,
        OrderRepositoryInterface $orderRespository,
        CarrierType $carrierType,
        ConnectUrgent $connectUrgent,
        ConnectFanCourier $connectFanCourier,
        ConnectGLS $connectGLS,
        ConnectDPD $connectDPD,
        ConnectDragonStar $connectDragonStar,
        ConnectNemoExpress $connectNemoExpress,
        RequestInterface $request,
        AwbRepository $awbRepository,
        AwbCollectionFactory $awbCollectionFactory
    )
    {
        $this->salesCollectionFactory = $salesCollectionFactory;
        $this->fileFactory = $fileFactory;
        $this->storeManager = $storeManager;
        $this->invoiceCollectionFactory = $invoiceCollectionFactory;
        $this->filesystem = $filesystem;
        $this->directory = $directory;
        $this->orderRespository = $orderRespository;
        $this->carrierType = $carrierType;
        $this->connectUrgent = $connectUrgent;
        $this->connectFanCourier = $connectFanCourier;
        $this->connectGLS = $connectGLS;
        $this->connectDPD = $connectDPD;
        $this->connectDragonStar = $connectDragonStar;
        $this->connectNemoExpress = $connectNemoExpress;
        $this->request = $request;
        $this->awbRepository = $awbRepository;
        $this->awbCollectionFactory = $awbCollectionFactory;
    }

    public function getAwbForOrder($order) {
        $mediaPath = $this->filesystem->getDirectoryRead(\Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR)->getAbsolutePath();
        $shipment = $order->getShipmentsCollection()->getFirstItem();
        if(isset($shipment)) {
            $awbObject = $this->awbCollectionFactory->create()->getItemByColumnValue('awb_number', $order->getData('awb_number'));
            if($awbObject) {
                $awbId = $awbObject->getData('entity_id');
                $awbNumber = $awbObject->getData('awb_number');
                $pickupId = null;
                $carrierId = $awbObject->getData('carrier_id');
                $this->setConnector($carrierId);
                $awbModel = $this->awbRepository->getById($awbId);
                if (!empty($awbModel->getData('awb_pickup_id'))) {
                    $pickupId = $awbModel->getData('awb_pickup_id');
                }

                return $this->getAwbDocumentPath(
                    ['media_path' => $mediaPath, 'tmp_filename' => 'AWB_' . $order->getId() . ".pdf"],
                    $awbNumber,
                    $pickupId
                );
            }
        }
        return null;
    }

    protected function setConnector($carrierId) {
        if ($carrierId >= 0) {
            switch ($carrierId)
            {
                case CarrierType::URGENT_CURRIER:
                    $this->carrierConnector = $this->connectUrgent;
                    break;
                case CarrierType::FAN_CURRIER:
                    $this->carrierConnector = $this->connectFanCourier;
                    break;
                case CarrierType::DPD:
                    $this->carrierConnector = $this->connectDPD;
                    break;
                case CarrierType::GLS:
                    $this->carrierConnector = $this->connectGLS;
                    break;
                case CarrierType::DRAGON_STAR:
                    $this->carrierConnector = $this->connectDragonStar;
                    break;
                case CarrierType::NEMO_EXPRESS:
                    $this->carrierConnector = $this->connectNemoExpress;
                    break;
            }
        }
    }

    protected function getAwbDocumentPath($fileData, $identifier, $pickupId) {


        if (method_exists($this->carrierConnector, 'getAwbDocument')) {
            $response = $this->carrierConnector->getAwbDocument($identifier, $pickupId);
            $fileAbsPath = $fileData['media_path'] . "/" . $fileData['tmp_filename'];
            file_put_contents($fileAbsPath, $response);
            $this->awbFilesPathArray[] = $fileAbsPath;
            return [
                "path" => $fileAbsPath,
                "filename" => $fileData["tmp_filename"]
            ];
        }
        return null;
    }
}

