<?php

namespace Leadlion\AutogedalOrderFlow\Model\Packeta;

use Eadesigndev\Urgent\Api\Data\GenerateAwbInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Filesystem\DirectoryList;
use Magento\Framework\Model\Context;
use Magento\Framework\Model\AbstractModel;
use Magento\Framework\HTTP\ClientInterface;
use Eadesigndev\Awb\Model\AwbRepository;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;

#[\AllowDynamicProperties]
class GenerateAwb extends AbstractModel implements GenerateAwbInterface
{
    const PACKETA_API_KEY = "carriers/packeta/cheie_api";
    const PACKETA_API_PASS = "carriers/packeta/parola_api";
    const PACKETA_API_URL = "carriers/packeta/url_api";

    protected $_client;
    protected $_awbRepository;
    protected $_orderRepository;

    public function __construct(
        Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
        \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
        array $data = [],
        ClientInterface $client = null,
        AwbRepository $awbRepository = null,
        OrderRepositoryInterface $orderRepository = null,
        ScopeConfigInterface $scopeConfig = null,
        DirectoryList $dir = null
    )
    {
        $this->_orderRepository = $orderRepository ?? ObjectManager::getInstance()->get(OrderRepositoryInterface::class);
        $this->_awbRepository = $awbRepository ?? ObjectManager::getInstance()->get(AwbRepository::class);
        $this->_client = $client ?? ObjectManager::getInstance()->get(ClientInterface::class);
        $this->_scopeConfig = $scopeConfig ?? ObjectManager::getInstance()->get(ScopeConfigInterface::class);
        $this->dir = $dir ?? ObjectManager::getInstance()->get(DirectoryList::class);
        parent::__construct($context, $registry, $resource, $resourceCollection, $data);
    }

    public function getApiUrl()
    {
        return $this->_scopeConfig->getValue(self::PACKETA_API_URL);
    }

    public function getApiUsername()
    {
        return $this->_scopeConfig->getValue(self::PACKETA_API_KEY);
    }

    public function getApiPassword()
    {
        return $this->_scopeConfig->getValue(self::PACKETA_API_PASS);
    }

    public function generateAwb($awbId)
    {
        $model = $this->_awbRepository->getById($awbId);
        $order = $this->_orderRepository->get((int)$model->getData('order_id'));
        $shippingAddress = $order->getShippingAddress();
        $streetName = $this->replaceDiacritics($model->getData('street'));

        $repaymentValue = $model->getData('repayment_value');
        $formattedRepaymentValue = round((float)$repaymentValue, 2);

        $packetAttributes = [
            'number' => $order->getIncrementId(),
            'name' => $shippingAddress->getData('firstname'),
            'surname' => $shippingAddress->getData('lastname'),
            'email' => $model->getData('customer_email'),
            'phone' => $model->getData('telephone'),
            'addressId' => 7397, // SAMDEDAY HD carrier ID
            'value' => '1',
            'cod' => $formattedRepaymentValue,
            'currency' => 'RON',
            'weight' => $model->getData('weight'),
            'eshop' => $model->getData('awb_pickup_id'),
            'street' => substr($streetName, 0, 32),
            'houseNumber' => '',
            'city' => $model->getData('city'),
            'zip' => $model->getData('postcode'),
            'note' => $model->getData('content')
        ];
        
        try {
            $client = new \SoapClient($this->getApiUrl());
            $result = $client->createPacket($this->getApiPassword(), $packetAttributes);
            return $result->id;
        } catch (\SoapFault $e) {
            if (isset($e->detail->PacketAttributesFault)) {
                $faults = $e->detail->PacketAttributesFault->attributes->fault;
                if (!is_array($faults)) {
                    $faults = [$faults];
                }
                $messages = array_map(function ($f) { return $f->fault; }, $faults);
                throw new \Exception(implode(' | ', $messages));
            } elseif (isset($e->detail->IncorrectApiPasswordFault)) {
                throw new \Exception('Incorrect API password.');
            }
        }
    }

    protected function replaceDiacritics($string)
    {
        if ($string) {
            $keywords = [
                'Ă' => 'A', 'ă' => 'a', 'Â' => 'A', 'â' => 'a', 'Î' => 'I', 'î' => 'i', 'Ș' => 'S', 'ş' => 's', 'ș' => 's', 'Ț' => 'T', 'ț' => 't',
                'Š' => 'S', 'š' => 's', 'Ž' => 'Z', 'ž' => 'z', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'A', 'Ç' => 'C', 'È' => 'E', 'É' => 'E',
                'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U',
                'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'Þ' => 'B', 'ß' => 'Ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'a', 'ç' => 'c',
                'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ð' => 'o', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o',
                'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ý' => 'y', 'þ' => 'b', 'ÿ' => 'y'
            ];
            $string = strtr($string, $keywords);
            $string = trim($string);
        }
        return $string;
    }

    public function getCreateShipmentRequestUrl()
    {
        return $this->getApiUrl() . self::DPD_API_CREATE;
    }

    public function deleteAwb($awbNumber)
    {
        $request = new \Zend\Http\Request();

        $header = [
            'Content-type: application/json;'
        ];

        $httpHeaders = new \Zend\Http\Headers();
        $httpHeaders->addHeaders(
            $header
        );

        $request->setHeaders($httpHeaders);

        $params = new \Zend\Stdlib\Parameters([
            "userName" => $this->getApiUsername(),
            "password" => $this->getApiPassword(),
            "shipmentId" => $awbNumber,
            "comment" => __('Canceled by admin')
        ]);
        $request->setQuery($params);

        $url = $this->getApiUrl() . self::DPD_API_CREATE;

        $request->setUri($url);
        $request->setMethod(\Zend\Http\Request::METHOD_DELETE);

        $client = new \Zend\Http\Client();
        $response = $client->send($request);

        return $response->getStatusCode() >= 200 && $response->getStatusCode() < 300;
    }

    public function getPunctRidicare()
    {
        // TODO: Implement getPunctRidicare() method.
    }

    public function setGenerateAwb($awbId)
    {
        // TODO: Implement setGenerateAwb() method.
    }
	
    public function getSiteId($city, $region) {
        if ($region == 'Satu-Mare') {
            $region = 'SATU MARE';
        }
	$logger = \Magento\Framework\App\ObjectManager::getInstance()->get(\Psr\Log\LoggerInterface::class);
	//$logger->info('getSiteId');
        //TODO to fix this
        //$csvFile = '/var/www/html/autogedal_upgrade/642.csv';
        $csvFile = $this->dir->getRoot() . '/' . '642.csv';
        $csv = $this->csvToArray($csvFile);

	foreach($csv as $key => $item) {
		//$logger->info("city: " . $city);
		//$logger->info("region: " . $region);	
		if(isset($item[5]) && isset($item[9]) && strtoupper($city) == strtoupper($item[5]) && strtoupper($region) == strtoupper($item[9])) {
        	//$logger->info(print_r($item, true));
                return $item[0];
            }
        }
        return false;
    }

    public function csvToArray($csvFile){
        $file_to_read = fopen($csvFile, 'r');
        while (!feof($file_to_read) ) {
            $lines[] = fgetcsv($file_to_read, 1000, ',');
        }
        fclose($file_to_read);
        return $lines;
    }
}
