<?php

namespace Eadesigndev\Sameday\Helper;

use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\App\ProductMetadataInterface;
use Magento\Framework\Encryption\EncryptorInterface;
use Magento\Framework\Message\ManagerInterface;
use Psr\Log\LoggerInterface;
use Sameday\Requests\SamedayRequestInterface;
use Sameday\Responses\SamedayResponseInterface;
use Sameday\Sameday;

#[\AllowDynamicProperties]
class ApiHelper extends AbstractHelper
{
    const COUNTY_MAP=[
        'Satu-Mare' => 'Satu Mare'
    ];

    /**
     * @var ProductMetadataInterface 
     */
    private $productMetadata;

    /**
     * @var EncryptorInterface
     */
    private $encryptor;

    /**
     * @var LoggerInterface
     */
    private $logger;

    /**
     * @var ManagerInterface
     */
    private $messageManager;

    /**
     * ApiHelper constructor.
     *
     * @param Context $context
     * @param ProductMetadataInterface $productMetadata
     * @param EncryptorInterface $encryptor
     */
    public function __construct(Context $context, ProductMetadataInterface $productMetadata, EncryptorInterface $encryptor, LoggerInterface $logger, ManagerInterface $messageManager)
    {
        parent::__construct($context);

        $this->productMetadata = $productMetadata;
        $this->encryptor = $encryptor;
        $this->logger = $logger;
        $this->messageManager = $messageManager;
    }

    public function removeDiacritics($str)
    {
        $diacritics = ['Ă','Â','Î','Ş','Ţ','ă','â','î','ş','ţ'];
        $normalCaracter = ['A','A','I','S','T','a','a','i','s','t'];

        return str_replace($diacritics, $normalCaracter, $str);
    }

    public function mapCountyName($region){
        if(
            isset(self::COUNTY_MAP[$region])
        ){
            return self::COUNTY_MAP[$region];
        }

        return $region;

    }

    /**
     * @param string|null $username
     * @param string|null $password
     * @param bool|null $testing
     *
     * @return \Sameday\SamedayClient
     *
     * @throws \Sameday\Exceptions\SamedaySDKException
     */
    public function initClient($username = null, $password = null, $testing = null)
    {
        if ($username === null && $password === null && $testing === null) {
            $username = $this->scopeConfig->getValue('carriers/sameday/username');
            $password = $this->encryptor->decrypt($this->scopeConfig->getValue('carriers/sameday/password'));
            $testing = $this->scopeConfig->getValue('carriers/sameday/testing');
        }

        return new \Sameday\SamedayClient(
            $username,
            $password,
            $testing ? 'https://sameday-api.demo.zitec.com' : 'https://api.sameday.ro',
            "{$this->productMetadata->getName()} ({$this->productMetadata->getEdition()})",
            $this->productMetadata->getVersion()
        );
    }

    /**
     * @param SamedayRequestInterface $request
     * @param string $type
     * @param bool $showFlashMessage
     *
     * @return false|SamedayResponseInterface
     */
    public function doRequest(SamedayRequestInterface $request, string $type = '', $showFlashMessage = true)
    {
        try {
            $sameday = new Sameday($this->initClient());
            return $sameday->{$type}($request);
        } catch(\Exception $e) {
            if ($showFlashMessage) {
                $this->messageManager->addError(__("SamedayCourier communication error occured. Please try again later"));
            }
            $this->logger->error('Sameday communication error', ['error' => $e]);
        }

        return false;
    }
}
