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

namespace Eadesigndev\Urgent\Model;

use Eadesigndev\Urgent\Helper\Data;
use Eadesigndev\Awb\Model\AwbRepository;
use Eadesigndev\Urgent\Helper\ConnectUrgent;
use Eadesigndev\Urgent\Api\Data\GenerateAwbInterface;
use Eadesigndev\Urgent\Model\Sources\DeliveryPayment;
use Magento\Framework\Registry;
use Magento\Framework\Model\Context;
use Magento\Framework\Model\AbstractModel;
use Magento\Framework\Data\Collection\AbstractDb;
use Magento\Framework\Model\ResourceModel\AbstractResource;
use Eadesigndev\Awb\Model\GenerateAwbCore;
use Monolog\Logger as MonoLogger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;

#[\AllowDynamicProperties]
class GenerateAwb extends GenerateAwbCore implements GenerateAwbInterface
{
    public $connectUrgent;

    public $awbRepository;

    private $helperData;
    /**
     * @var \Zend\Log\Logger
     */
    private $logger;

    public function __construct(
        Context $context,
        Registry $registry,
        ConnectUrgent $connectUrgent,
        AwbRepository $awbRepository,
        Data $helperData,
        ?AbstractResource $resource = null,
        ?AbstractDb $resourceCollection = null,
        array $data = []
    ) {
        $this->helperData    = $helperData;
        $this->connectUrgent = $connectUrgent;
        $this->awbRepository = $awbRepository;
        $monolog = new MonoLogger('getawbbbb');
        $monolog->pushHandler(new StreamHandler(BP . '/var/log/getawb.log', Level::Debug));
        $this->logger = $monolog;
        
        parent::__construct(
            $context,
            $registry,
            $resource,
            $resourceCollection,
            $data
        );
    }

    public function getPunctRidicare()
    {
        $connectUrgent = $this->connectUrgent;

        $pickupLocation = $connectUrgent->connect('PickupLocations', \Laminas\Http\Request::METHOD_GET);

        return $pickupLocation;
    }

    public function getPricePlans()
    {
        $connectUrgent = $this->connectUrgent;

        $tariffPlan = $connectUrgent->connect('PriceTables', \Laminas\Http\Request::METHOD_GET);

        return $this->toOptionArrayReplace($tariffPlan, 'PriceTableId', 'Name');
    }

    public function generateAwb($awbId)
    {
        $this->logger->info(' --- generateAwb Urgent ---  ');
        $model = $this->awbRepository->getById($awbId);
        $this->logger->info('$awbId: '.$awbId);
        $paymentMethod = $model->getData('payment_method');
        if ($paymentMethod == 1) {
            $cashPayment = $model->getData('repayment_value');
            $collectorAccount = 0;
        } else {
            $cashPayment = 0;
            $collectorAccount = $model->getData('repayment_value');
        }

        $openPackageVal = $model->getData('open_package');
        if ($openPackageVal) {
            $openPackage = true;
        } else {
            $openPackage = false;
        }

        $deliverySaturdayVal = $model->getData('delivery_saturday');
        if ($deliverySaturdayVal) {
            $deliverySaturday = true;
        } else {
            $deliverySaturday = false;
        }

        $destinatar = DeliveryPayment::EXPEDITOR;
        $expeditor = DeliveryPayment::DESTINATAR;

        $deliveryPayment = $model->getData('delivery_payment');
        if ($deliveryPayment == '0') {
            $deliveryPaymentUrgent = $expeditor;
        } else {
            $deliveryPaymentUrgent = $destinatar;
        };

        $connectUrgent = $this->connectUrgent;
        $connectUrgent->getToken();
        $contactPerson=substr($model->getData('recipient'), 0, 25);
        if($model->getData('contact')){
            $contactPerson=substr($model->getData('contact'), 0, 25);
        }

        $this->logger->info('$contactPerson: '.$contactPerson);
        $helperData = $this->helperData;
        $localityName = $helperData->removeDiacritics($model->getData('city'));
        $this->logger->info('$localityName: '.$localityName);
        $countyName = $helperData->removeDiacritics($model->getData('region_id'));
        $localityName = $helperData->mapCityName($localityName,$countyName);
        $countyName   = $helperData->mapCountyName($countyName);
        $this->logger->info('$localityName - mapped: '.$localityName);
        $fields = [
            'Sender' => [
                'LocationId' => $model->getData('awb_pickup_id')
            ],
            'Recipient' => [
                'Name'           => $model->getData('recipient'),
                'CountyId'       => 0,
                'CountyName'     => $countyName,
                'LocalityId'     => 0,
                'BuildingNumber' => '',
                'LocalityName'   => $localityName,
                'StreetId'       => 0,
                'StreetName'     => $model->getData('street'),
                'AddressText'    => $model->getData('street'),
                'ContactPerson'  => $contactPerson,
                'PhoneNumber'    => $model->getData('telephone'),
                'Email'          => $model->getData('customer_email'),
            ],
            'Parcels'          => $model->getData('packages'),
            'Envelopes'        => $model->getData('envelopes'),
            'TotalWeight'      => round($model->getData('weight')),
            'DeclaredValue'    => 0.0,
            'CashRepayment'    => $cashPayment,
            'BankRepayment'    => $collectorAccount,
            'OtherRepayment'   => '',
            'OpenPackage'      => $openPackage,
            'PriceTableId'     => $model->getData('tariff_plan'),
            'ShipmentPayer'    => $deliveryPaymentUrgent,
            'SaturdayDelivery' => $deliverySaturday,
            'Observations'     => $model->getData('comments'),
            'PackageContent'   => $model->getData('content'),
            'CustomString'     => ''
        ];
        $this->logger->info(print_r($fields,true));
        $awbNumber = $connectUrgent->connect('Awbs', \Laminas\Http\Request::METHOD_POST, $fields);
        $this->logger->info('urgentCargus $apiResponse: ' .print_r($awbNumber, true));
        $this->logger->info(' end --- generateAwb Urgent ---  ');
        return $awbNumber;
    }

    public function getDataCity($countyId = 44)
    {
        $connectUrgent = $this->connectUrgent;

        $localities = $connectUrgent->connect('Localities?countryId=1&countyId=' . $countyId, \Laminas\Http\Request::METHOD_GET);

        return $localities;
    }

    public function getDataCounty()
    {
        $connectUrgent = $this->connectUrgent;

        $counties = $connectUrgent->connect('Counties?countryId=1', \Laminas\Http\Request::METHOD_GET);

        return $counties;
    }

    public function deleteAwb($awbNumber)
    {
        $connectUrgent = $this->connectUrgent;
        $connectUrgent->getToken();

        $response = $connectUrgent->deleteConnect('Awbs?barCode=' . $awbNumber);
        return $response->getStatusCode() >= 200 && $response->getStatusCode() < 300;
    }




}
