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

namespace Eadesigndev\Urgent\Model\Carrier;

use Eadesigndev\Urgent\Helper\Data as DataHelper;
use Eadesigndev\Urgent\Helper\ConnectUrgent;
use http\Exception;
use Magento\Checkout\Model\Cart;
use Magento\Quote\Model\Quote\Address\RateRequest;
use Magento\Shipping\Model\Carrier\AbstractCarrierOnline;
use Magento\Shipping\Model\Carrier\CarrierInterface;
use Magento\Ups\Helper\Config;
use Magento\Framework\Xml\Security;
use Magento\Framework\DataObject;
use Psr\Log\LoggerInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory;
use Magento\Shipping\Model\Simplexml\ElementFactory;
use Magento\Shipping\Model\Rate\ResultFactory;
use Magento\Quote\Model\Quote\Address\RateResult\MethodFactory;
use Magento\Shipping\Model\Tracking\ResultFactory as ResultTrackFactory;
use Magento\Shipping\Model\Tracking\Result\ErrorFactory as ErrorTrackFactory;
use Magento\Shipping\Model\Tracking\Result\StatusFactory;
use Magento\Directory\Model\RegionFactory;
use Magento\Directory\Model\CountryFactory;
use Magento\Directory\Model\CurrencyFactory;
use Magento\Directory\Helper\Data;
use Magento\CatalogInventory\Api\StockRegistryInterface;
use Magento\Framework\Locale\FormatInterface;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Framework\App\Request\Http;

#[\AllowDynamicProperties]
class Carrier extends AbstractCarrierOnline implements CarrierInterface
{
    const CODE = 'eadesigndevurgent';

    protected $_code = 'eadesigndevurgent';

    protected $request;

    protected $httpRequest;

    protected $result;

    protected $baseCurrencyRate;

    protected $xmlAccessRequest;

    protected $localeFormat;

    protected $logger;

    protected $configHelper;

    protected $errors = [];

    protected $isFixed = true;

    private $dataHelper;

    private $rateFactory;

    private $rateMethodFactory;

    private $storeManager;

    private $connectUrgent;

    private $cart;

    public function __construct(
        ScopeConfigInterface $scopeConfig,
        ErrorFactory $rateErrorFactory,
        LoggerInterface $logger,
        Security $xmlSecurity,
        ElementFactory $xmlElFactory,
        ResultFactory $rateFactory,
        MethodFactory $rateMethodFactory,
        ResultTrackFactory $trackFactory,
        ErrorTrackFactory $trackErrorFactory,
        StatusFactory $trackStatusFactory,
        RegionFactory $regionFactory,
        CountryFactory $countryFactory,
        CurrencyFactory $currencyFactory,
        Data $directoryData,
        StockRegistryInterface $stockRegistry,
        FormatInterface $localeFormat,
        Config $configHelper,
        DataHelper $dataHelper,
        ConnectUrgent $connectUrgent,
        Cart $cart,
        RateRequest $request,
        StoreManagerInterface $storeManager,
        Http $httpRequest,
        array $data = []
    ) {
        $this->httpRequest       = $dataHelper;
        $this->cart              = $cart;
        $this->request           = $request;
        $this->dataHelper        = $dataHelper;
        $this->rateFactory       = $rateFactory;
        $this->configHelper      = $configHelper;
        $this->localeFormat      = $localeFormat;
        $this->storeManager      = $storeManager;
        $this->connectUrgent     = $connectUrgent;
        $this->rateMethodFactory = $rateMethodFactory;

        parent::__construct(
            $scopeConfig,
            $rateErrorFactory,
            $logger,
            $xmlSecurity,
            $xmlElFactory,
            $rateFactory,
            $rateMethodFactory,
            $trackFactory,
            $trackErrorFactory,
            $trackStatusFactory,
            $regionFactory,
            $countryFactory,
            $currencyFactory,
            $directoryData,
            $stockRegistry,
            $data
        );
    }

    protected function _doShipmentRequest(DataObject $request)
    {
    }

    public function getAllowedMethods()
    {
        return [$this->getCarrierCode() => __($this->getConfigData('name'))];
    }

    public function collectRates(RateRequest $request)
    {

        $this->getAllowedMethods();

        $result = $this->rateFactory->create();

        /*store shipping in session*/
        $method = $this->rateMethodFactory->create();
        $methodName = $this->dataHelper->getMethodName();

        $code = self::CODE;
        $method->setCarrier($code);
        $method->setCarrierTitle($methodName);

        /* Use method name */
        $methodTitle = $this->dataHelper->getMethodTitle();
        $method->setMethod($code);
        $method->setMethodTitle($methodTitle);

        $shippingPrice = $this->calculateUrgentShipment($request);


        $method->setCost($shippingPrice);
        $method->setPrice($shippingPrice);
        $result->append($method);

        return $result;
    }

    public function calculateUrgentShipment($request)
    {
        if ($request['dest_city'] == '') {
            return false;
        }

        $parcel = 0;
        $envelopes = 1;
        if ($this->dataHelper->getParcelsEnvelopes()) {
            $parcel = 1;
            $envelopes = 0;
        }

        $fields = [
            'FromLocalityId'   => $this->fromLocalityId(),
            'FromCountyName'   => $this->fromLocalityName($request),
            'FromLocalityName' => $this->fromLocalityName($request),

            'ToLocalityId'     => 0,
            'ToCountyName'     => $this->countyName($request),
            'ToLocalityName'   => $this->localityName($request),

            'Parcels'          => $parcel,
            'Envelopes'        => $envelopes,
            'TotalWeight'      => round($this->packageWeight($request)),
            'DeclaredValue'    => 0,
            'CashRepayment'    => 0,
            'BankRepayment'    => $this->bankRepayment($request),
            'OtherRepayment'   => '',
            'OpenPackage'      => $this->dataHelper->getOpenPackage(),
            'PriceTableId'     => $this->dataHelper->getPlanTarifar(),
            'MorningDelivery'  => 0,
            'ShipmentPayer'    => 1,
            'SaturdayDelivery' => 1
        ];

        $connect = $this->connectUrgent;
        $calculate = $connect->connect('ShippingCalculation', \Laminas\Http\Request::METHOD_POST, $fields);

        $grandTotal        = $calculate;
        $valuePackage      = $this->bankRepayment($request);
        $valueFreeShipping = $this->dataHelper->getPrice();

        if ($valuePackage < $valueFreeShipping) {
            $total = round(($grandTotal['GrandTotal']), 2);
        } else {
            $total = 0;
        }

        return $total;
    }

    private function fromLocalityId()
    {
        $fromLocality = 309;

        return $fromLocality;
    }

    private function fromLocalityName($request)
    {
        $localityName = $request->getData('city');

        return $localityName;
    }
    
    private function countyName($request)
    {
        $countyName = $request->getData('dest_region_code');

        return $countyName;
    }

    private function localityName($request)
    {
        $localityName = $request->getData('dest_city');

        return $localityName;
    }

    private function packageWeight($request)
    {
        $packageWeight = $request->getData('package_weight');

        return $packageWeight;
    }

    private function bankRepayment($request)
    {
        $bankRepayment = $request->getData('base_subtotal_incl_tax');

        return $bankRepayment;
    }

    public function proccessAdditionalValidation(DataObject $request)
    {
        return true;
    }

    public function processAdditionalValidation(\Magento\Framework\DataObject $request)
    {
        return true;
    }

    public function getAwbDocument($identifier)
    {
        return base64_decode($this->connectUrgent->connect('AwbDocuments?type=PDF&format=0&printMainOnce=2&barCodes=' . $identifier, \Laminas\Http\Request::METHOD_GET));
    }
}