<?php
/**
 * Copyright © 2018 EaDesign by Eco Active S.R.L. All rights reserved.
 * See LICENSE for license details.
 */

namespace Eadesigndev\Urgent\Helper;

use Eadesigndev\Urgent\Helper\Data as DataUrgentHelper;
use Magento\Framework\Json\Helper\Data as JsonHelperData;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\App\Request\Http;
use Magento\Framework\HTTP\Adapter\Curl;
use Magento\Framework\HTTP\Client\Curl as AdvCurl;
use Psr\Log\LoggerInterface;

/**
 * Handles the config and other settings
 *
 * Class ConnectUrgent
 * @package Eadesigndev\Urgent\Helper
 */

#[\AllowDynamicProperties]
class ConnectUrgent extends AbstractHelper
{
    public $context;

    public $request;

    public $dataUrgentHelper;

    public $jsonHelperData;

    public $loggerInterface;

    private $token;

    private $curl;
    private $_advCurl;

    /**
     * ConnectUrgent constructor.
     * @param DataUrgentHelper $dataUrgentHelper
     * @param JsonHelperData $jsonHelperData
     * @param LoggerInterface $loggerInterface
     * @param Context $context
     */
    public function __construct(
        Context $context,
        DataUrgentHelper $dataUrgentHelper,
        JsonHelperData $jsonHelperData,
        LoggerInterface $loggerInterface,
        Http $request,
        Curl $curl,
        AdvCurl $advCurl
    ) {
        $this->dataUrgentHelper = $dataUrgentHelper;
        $this->jsonHelperData   = $jsonHelperData;
        $this->loggerInterface  = $loggerInterface;
        $this->request          = $request;
        $this->curl             = $curl;
        $this->_advCurl         = $advCurl;
        $this->_getToken();
        parent::__construct($context);
    }

    private function _getToken()
    {
        $curl = $this->curl;
        $curl->setConfig(
            [
                'timeout' => 15,
                'returntransfer' => false,
                'header' => false
            ]
        );

        $getConfig = $this->dataUrgentHelper;
        $loginFields = [
            'UserName' => $getConfig->getConfigUsername(),
            'Password' => $getConfig->getConfigPassword(),
        ];

        $body = json_encode($loginFields);

        $header = [
            'Ocp-Apim-Subscription-Key: ' . $getConfig->getApiKey(),
            'Content-Type: application/json',
            'Content-Length: ' . strlen($body)
        ];

        try {
            $curl->write(
                \Laminas\Http\Request::METHOD_POST,
                $getConfig->getUrl() . 'LoginUser',
                '1.0',
                $header,
                $body
            );
        } catch (\Exception $e) {
            $this->loggerInterface->error('Login Fail!');
        }

        $read = $curl->read();

        $this->token = json_decode($read);

        return $this;
    }

    public function getToken($simple = false)
    {
        $token = $this->token;

        if ($simple) {
            $fields = $token;
        } else {
            $fields = [
                'Token' => $token
            ];
        }
        return $fields;
    }

    public function connect($action, $type = \Laminas\Http\Request::METHOD_POST, $parameters = [])
    {
        $body = $this->jsonHelperData->jsonEncode($parameters);

        $getConfig = $this->dataUrgentHelper;

        if(is_string($this->token)){
            $token = $this->token;
        } else {
            $token = 'failed';
        }

        if (!empty($token)) {
            $header = [
                'Ocp-Apim-Subscription-Key: ' . $getConfig->getApiKey(),
                'Authorization: Bearer ' . $token
            ];
            if ($body != "[]") {
                $header[] = 'Content-Type: application/json';
                $header[] = 'Content-Length: ' . strlen($body);
            }
        }

        $url = $getConfig->getUrl() . $action;

        try {
            $this->curl->write(
                $type,
                $url,
                '1.0',
                $header,
                $body
            );
        } catch (\Exception $e) {
            $this->loggerInterface->error('Connect Fail!');
        }

        $read = $this->curl->read();

        $this->curl->close();

        if (!empty($read)){
            $response = $this->jsonHelperData->jsonDecode($read);
            return $response;
        }
    }

    public function deleteConnect($action)
    {
        $request = new \Zend\Http\Request();

        $getConfig = $this->dataUrgentHelper;

        if(is_string($this->token)){
            $token = $this->token;
        } else {
            $token = 'failed';
        }

        if (!empty($token)) {
            $header = [
                'Ocp-Apim-Subscription-Key: ' . $getConfig->getApiKey(),
                'Authorization: Bearer ' . $token
            ];
        }

        $httpHeaders = new \Zend\Http\Headers();
        $httpHeaders->addHeaders(
            $header
        );

        $request->setHeaders($httpHeaders);

        $url = $getConfig->getUrl() . $action;

        $request->setUri($url);
        $request->setMethod(\Zend\Http\Request::METHOD_DELETE);

        $client = new \Zend\Http\Client();
        $response = $client->send($request);

        return $response;
    }
}
