<?php
namespace Eadesigndev\DragonStar\Helper;

use Magento\Framework\App\Config\ScopeConfigInterface;
use Psr\Log\LoggerInterface;
use Monolog\Logger as MonoLogger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;

/**
 * @category   FanCourier
 * @package    FanCourier_Customshipping
 * @author     programare@fancourier.ro
 * @website    https://www.fancourier.ro
 */
#[\AllowDynamicProperties]
class Api extends \Magento\Framework\App\Helper\AbstractHelper
{
    const URL_API_PROD = 'https://app.curierdragonstar.ro';
    const URL_API_TEST = 'https://app.curierdragonstar.ro/test';
    const URL_JUDETE = '/judete';
    const URL_LOCALITATI = '/localitati/';
    const MASTER_PATH_PC    = '/master/pcs';
    const URL_AWB_SEND = '/awb/send';
    const ORDER_PATH_PC    = '/awb/sendForPc';
    const URL_AWB_PRINT = '/awb/print/';
    const URL_AWB_COST = '/awb/cost';
    const URL_AWB_DELETE = '/awb/';
    const URL_AWB_STATUS = '/awb/status/';
    const URL_BORDEROU_MAKE = '/borderou/make';
    const URL_BORDEROU_PRINT = '/borderou/print/';
    const CONTENT_TYPE_JSON = 'application/json';
    const CONTENT_TYPE_FORM = 'application/x-www-form-urlencoded';
    const CONTENT_TYPE_HTML = 'text/html';

    private $user_passwd;//username and password
    private $url = self::URL_API_PROD;//test or prod
    private $error;//last error
    private $total_time;//Total transaction time in seconds for last transfer
    private $size_download;//Total number of bytes downloaded
    private $ch;//curl object
    private $fp;//file pointer
    private $awb;
    private $totalNet;
    private $baza;
    private $costKm;
    private $costGreutate;
    private $costAsigurare;
    private $esteTarifStandard;
    private $tva;
    private $borderou;
    private $nrExpeditii;
    private $lastDataStatus;
    private $lastStatus;
    private $detalii;
    private $lastDataDetalii;
    private $lastEvtDetalii;
    private $lastCentruDetalii;

    const SETTINGS_KEY_USERNAME = "carriers/dragon/username";
    const SETTINGS_KEY_PASSWORD = "carriers/dragon/password";
    const TEST_MODE = false;
    /**
     * @var \Zend\Log\Logger
     */
    private $logger;

    /**
     * Instantiate the class.
     *
     *
     */
    public function __construct(
        ScopeConfigInterface $scopeConfig
    )
    {
        $this->scopeConfig = $scopeConfig;
        $user   = $this->scopeConfig->getValue(self::SETTINGS_KEY_USERNAME);
        $passwd = $this->scopeConfig->getValue(self::SETTINGS_KEY_PASSWORD);
        $test   = self::TEST_MODE;
        $monolog = new MonoLogger('api');
        $monolog->pushHandler(new StreamHandler(BP . '/var/log/getawb.log', Level::Debug));
        $this->logger = $monolog;

        $this->user_passwd = base64_encode($user.":".$passwd);
        if($test) $this->url = self::URL_API_TEST;
    }

    /**
     * Sets a parameter or an object.
     *
     *
     *
     *
     * @param  string           $id    The unique identifier for the parameter or object
     * @param  mixed            $value The value of the parameter or a closure to define an object
     * @throws RuntimeException Prevent override of a frozen service
     */
    private function apiStart($mode)
    {
        $this->awb = '';
        $this->totalNet = '';
        $this->baza = '';
        $this->costKm = '';
        $this->costGreutate = '';
        $this->costAsigurare = '';
        $this->esteTarifStandard = '';
        $this->tva = '';
        $this->borderou = '';
        $this->nrExpeditii = '';
        $this->lastDataStatus = '';
        $this->lastStatus = '';
        $this->detalii = false;
        $this->total_time = '';
        $this->size_download = '';
        $this->error='';

        $this->ch = curl_init();
        curl_setopt($this->ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC) ;
        curl_setopt($this->ch, CURLOPT_SSLVERSION,3);
        curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($this->ch, CURLOPT_HEADER, false);
        curl_setopt($this->ch, CURLOPT_CUSTOMREQUEST, $mode);
        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($this->ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
        curl_setopt($this->ch,CURLOPT_FAILONERROR,false);
        curl_setopt($this->ch, CURLOPT_FORBID_REUSE, 1);
        curl_setopt($this->ch, CURLOPT_FRESH_CONNECT, 1);
    }

    /**
     * Sets a parameter or an object.
     *
     *
     *
     *
     * @param  string           $id    The unique identifier for the parameter or object
     * @param  mixed            $value The value of the parameter or a closure to define an object
     * @throws
     */
    private function apiStop()
    {
        if(isset($this->ch)) curl_close($this->ch);
        if(isset($this->fp)) fclose($this->fp);
    }

    /**
     * Test api
     * @throws
     */
    public function apiTest()
    {
        $this->apiStart('POST');
        curl_setopt($this->ch, CURLOPT_HTTPHEADER, array('Authorization: Basic '.base64_encode($this->user_passwd),'Content-Type: '.self::CONTENT_TYPE_JSON));
        curl_setopt($this->ch, CURLOPT_URL, $this->url);

        $response = curl_exec($this->ch);
        $response_info = curl_getinfo($this->ch);
        $this->total_time = $response_info['total_time'];
        $this->size_download = $response_info['size_download'];

        $this->apiStop();
        // Response HTTP Status Code
        if (isset($response_info['http_code']) && ($response_info['http_code'] == 400 || $response_info['http_code'] == 401 || $response_info['http_code'] == 404 || $response_info['http_code'] == 200)) {
            if($response_info['content_type'] == self::CONTENT_TYPE_JSON)
            {
                $json_response = json_decode($response,true);
                $this->error = $json_response['message'];
            }
            else if($response_info['content_type'] == self::CONTENT_TYPE_HTML) $this->error = $response;
            return false;
        }
        //no errors
        return $response;
    }

    /**
     * Insert new awb.
     *
     *
     *
     *
     * @param  array           $fields    array(  'judet' => '',
     *											  'localitate' => '',
     *											  'destinatar' => '',
     *											  'adresa' => '',
     *											  'contact' => '',
     *											  'telefon' => '',
     *											  'tipExpeditie' => '',
     *											  'nrColete' => 0 ,
     *											  'greutate' => 0 ,
     *											  'platitorEsteDestinatarul' => 0
     *											  'valoareAsigurare' => 0 ,
     *											  'valoareRamburs' => 0,
     *											  'ret_doc' => 0,
     *											  'ret_nt' => 0,
     *											  'tarifUrgenta' => 0,
     *											  'tarifSambata' => 0,
     *											  'livrareSediu' => 0,
     *											  'observatii' => ''
     *											  );
     * @throws
     */
    public function awbSend($fields)
    {

//todo fix this
        $data = array(
            'pcId'    => isset($fields['awb_pickup_id'])?$fields['awb_pickup_id']:'',
            'judet' => $this->remove_accents($fields['judet']),
            'localitate' =>  $this->remove_accents($fields['localitate']),
            'destinatar'    =>  $fields['destinatar'],
            'telefon'       =>  $fields['telefon'],
            'adresa'        =>  $fields['adresa'],
            'tipExpeditie'  =>  $fields['tipExpeditie'],
            'nrColete'      =>  $fields['nrColete'],
            'greutate'      =>  $fields['greutate'],
            'platitorEsteDestinatarul' => 0, // optional : fixed : 0 | 1 : default : 0
            'valoareRamburs' =>  $fields['valoareRamburs'],// : optional : decimal : default : 0.00
            'ret_doc'       => 0, //optional : fixed : 0 | 1 : default : 0
            'ret_nt'        => 0, //optional : fixed : 0 | 1 : default : 0
            'tarifUrgenta'  => 0, //optional : fixed : 0 | 1 : default : 0
            'tarifSambata'  =>  $fields['tarifSambata'], //optional : fixed : 0 | 1 : default : 0
            'livrareSediu'  => 0, //optional : fixed : 0 | 1 : default : 0
            'observatii'    =>  $fields['observatii']
        );
        $this->logger->info(print_r($data,true));
       if($data['pcId']){
           $json_response=  $this->sendForPc($data);
       }
       else{
           $json_response= $this->sendNoPc($data);
       }
        if(isset($json_response['totalNet'])){
            $this->totalNet = $json_response['totalNet'];
        }
        if(isset( $json_response['awb']) ){
            $this->awb = $json_response['awb'];
          //  $this->sendForPc($data);
            return $this->awb;
        }

        return false;

    }
    public function sendNoPc($data){
        $this->logger->info('sendNoPc');
        $curl = curl_init();
        $data_string = json_encode($data);
// todo adapt apiItini to new headers and curl params
        curl_setopt_array($curl, array(

            CURLOPT_URL => $this->url.self::URL_AWB_SEND,
            CURLOPT_POST => count($data),
            CURLOPT_POSTFIELDS => $data_string,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_HTTPHEADER => array(
                'Authorization: Basic ' .$this->user_passwd,
                'Cache-Control: no-cache',
                'Content-Length: '. strlen($data_string),
                'Content-Type: application/json'
            ),
        ));
        $this->logger->info('url: '.$this->url.self::URL_AWB_SEND);
        $response = curl_exec($curl);

        //todo treat errors
        $err = curl_error($curl);

        curl_close($curl);
        $this->logger->info(print_r($response,true));
        $json_response = json_decode($response,true);
        $this->logger->info(print_r($json_response,true));
        return $json_response;
    }
    public function sendForPc($data){
        $this->logger->info('sendForPc');

        $curl = curl_init();
        $data_string = json_encode($data);

// todo adapt apiItini to new headers and curl params

        curl_setopt_array($curl, array(

            CURLOPT_URL => $this->url.self::ORDER_PATH_PC,
            CURLOPT_POST => count($data),
            CURLOPT_POSTFIELDS => $data_string,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_HTTPHEADER => array(
                'Authorization: Basic ' .$this->user_passwd,
                'Cache-Control: no-cache',
                'Content-Length: '. strlen($data_string),
                'Content-Type: application/json'
            ),
        ));
        $this->logger->info('url: '.$this->url.self::ORDER_PATH_PC);
        $response = curl_exec($curl);

        //todo treat errors
        $err = curl_error($curl);

        curl_close($curl);
        $this->logger->info(print_r($response,true));

        return json_decode($response,true);
    }

    /**
     * awb price
     *
     *
     *
     *
     * @param  array           $fields    array(  'judet' => '',
     *											  'localitate' => '',
     *											  'destinatar' => '',
     *											  'tipExpeditie' => '',
     *											  'nrColete' => 0 ,
     *											  'greutate' => 0 ,
     *											  'platitorEsteDestinatarul' => 0
     *											  'valoareAsigurare' => 0 ,
     *											  'valoareRamburs' => 0,
     *											  'ret_doc' => 0,
     *											  'ret_nt' => 0,
     *											  'tarifUrgenta' => 0,
     *											  'tarifSambata' => 0,
     *											  'livrareSediu' => 0
     *											  );
     * @throws
     */

    public function awbCost($fields)
    {
        $this->apiStart('POST');
        curl_setopt($this->ch, CURLOPT_HTTPHEADER, array('Authorization: Basic '.base64_encode($this->user_passwd),'Content-Type: '.self::CONTENT_TYPE_JSON));
        curl_setopt($this->ch, CURLOPT_URL, $this->url.self::URL_AWB_COST);
        if(is_array($fields)) curl_setopt($this->ch, CURLOPT_POSTFIELDS, json_encode($fields));

        $response = curl_exec($this->ch);
        $response_info = curl_getinfo($this->ch);
        $this->total_time = $response_info['total_time'];
        $this->size_download = $response_info['size_download'];

        $this->apiStop();
        // Response HTTP Status Code
        if (isset($response_info['http_code']) && ($response_info['http_code'] == 400 || $response_info['http_code'] == 401 || $response_info['http_code'] == 404)) {
            if($response_info['content_type'] == self::CONTENT_TYPE_JSON)
            {
                $json_response = json_decode($response,true);
                $this->error = $json_response['message'];
            }
            else if($response_info['content_type'] == self::CONTENT_TYPE_HTML) $this->error = $response;
            return false;
        }
        //no errors
        //var_dump($response);
        $json_response = json_decode($response,true);
        $this->baza = $json_response['baza'];
        $this->costKm = $json_response['costKm'];
        $this->costGreutate = $json_response['costGreutate'];
        $this->costAsigurare = $json_response['costAsigurare'];
        $this->esteTarifStandard = $json_response['esteTarifStandard'];
        $this->tva = $json_response['tva'];
        $this->totalNet = $json_response['totalNet'];
        return $this->totalNet;
    }

    public function getPcIds()
    {

        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => $this->url.self::MASTER_PATH_PC,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => 'GET',
            CURLOPT_HTTPHEADER => array(
                "Authorization: Basic ".$this->user_passwd,
                "Content-Type: application/json"
            )
        ));

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        //todo treat errors
        if($response == 'Access denied'){
            return false;
            //return json_encode(array('message'=>$response));
        }
        $array = json_decode($response, true);
        if(isset($array['rezultate']) && $array['rezultate']>0 && $array['puncte_de_lucru']){
            return $array['puncte_de_lucru'];

        }
        return false;
    }

    /**
     * @param $awb
     * @param $folder
     * @param $file
     * @return bool|string
     */
    public function awbPrint($awb, $folder = '', $file = '')
    {

        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => $this->url.self::URL_AWB_PRINT.$awb,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => 'GET',
            CURLOPT_HTTPHEADER => array(
                "Authorization: Basic ".$this->user_passwd,
                "Content-Type: application/json"
            )
        ));

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        //todo treat errors
        if($response == 'Access denied'){
            return json_encode(array('message'=>$response));
        }

        $array = json_decode($response, true);

        return $response;
    }

    /**
     * delete awb
     *
     *
     *
     *
     * @param  numeric       $awb    numarul de awb
     * @throws
     */

    public function awbDelete($awb)
    {
        $this->apiStart('DELETE');
        curl_setopt($this->ch, CURLOPT_HTTPHEADER, array('Authorization: Basic '.base64_encode($this->user_passwd),'Content-Type: '.self::CONTENT_TYPE_FORM));
        curl_setopt($this->ch, CURLOPT_URL, $this->url.self::URL_AWB_DELETE.$awb);

        $response = curl_exec($this->ch);
        $response_info = curl_getinfo($this->ch);
        $this->total_time = $response_info['total_time'];
        $this->size_download = $response_info['size_download'];

        $this->apiStop();
        // Response HTTP Status Code
        if (isset($response_info['http_code']) && ($response_info['http_code'] == 400 || $response_info['http_code'] == 401 || $response_info['http_code'] == 404)) {
            if($response_info['content_type'] == self::CONTENT_TYPE_JSON)
            {
                $json_response = json_decode($response,true);
                $this->error = $json_response['message'];
            }
            else if($response_info['content_type'] == self::CONTENT_TYPE_HTML) $this->error = $response;
            return false;
        }
        //no errors
        return true;
    }

    /**
     * make borderou
     *
     *
     *
     *
     *
     * @throws
     */

    public function borderouMake()
    {
        $this->apiStart('POST');
        curl_setopt($this->ch, CURLOPT_HTTPHEADER, array('Authorization: Basic '.base64_encode($this->user_passwd),'Content-Type: '.self::CONTENT_TYPE_JSON));
        curl_setopt($this->ch, CURLOPT_URL, $this->url.self::URL_BORDEROU_MAKE);

        $response = curl_exec($this->ch);
        $response_info = curl_getinfo($this->ch);
        $this->total_time = $response_info['total_time'];
        $this->size_download = $response_info['size_download'];

        $this->apiStop();
        // Response HTTP Status Code
        if (isset($response_info['http_code']) && ($response_info['http_code'] == 400 || $response_info['http_code'] == 401 || $response_info['http_code'] == 404 || $response_info['http_code'] == 200)) {
            if($response_info['content_type'] == self::CONTENT_TYPE_JSON)
            {
                $json_response = json_decode($response,true);
                $this->error = $json_response['message'];
            }
            else if($response_info['content_type'] == self::CONTENT_TYPE_HTML) $this->error = $response;
            return false;
        }
        //no errors
        $json_response = json_decode($response,true);
        $this->borderou = $json_response['borderou'];
        $this->nrExpeditii = $json_response['nrExpeditii'];
        return $this->borderou;
    }

    /**
     * get borderou pdf
     *
     *
     *
     *
     * @param  numeric       $borderou    numarul de borderou
     * @throws
     */

    public function borderouPrint($borderou, $folder = '', $file = '')
    {
        if(empty($file)) $file = 'Borderou-'.$borderou.'.pdf';
        else $file = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $file);
        if(empty($folder)) $folder = './';
        else if(substr($folder,-1) == '/') $folder = substr($folder,0,-1);

        $file = $folder.'/'.$file;

        $this->apiStart('GET');
        curl_setopt($this->ch, CURLOPT_HTTPHEADER, array('Authorization: Basic '.base64_encode($this->user_passwd),'Content-Type: '.self::CONTENT_TYPE_FORM));
        curl_setopt($this->ch, CURLOPT_URL, $this->url.self::URL_BORDEROU_PRINT.$borderou);
        $this->fp = fopen($file, "wb");
        if($this->fp == false) { $this->error = 'error opening file : '.$file; $this->apiStop(); return false; }
        curl_setopt($this->ch, CURLOPT_FILE, $this->fp);

        $response = curl_exec($this->ch);
        $response_info = curl_getinfo($this->ch);
        $this->total_time = $response_info['total_time'];
        $this->size_download = $response_info['size_download'];

        $this->apiStop();
        // Response HTTP Status Code
        if (isset($response_info['http_code']) && ($response_info['http_code'] == 400 || $response_info['http_code'] == 401 || $response_info['http_code'] == 404)) {
            if($response_info['content_type'] == self::CONTENT_TYPE_JSON)
            {
                $json_response = json_decode(file_get_contents($file),true);
                $this->error = $json_response['message'];
            }
            else if($response_info['content_type'] == self::CONTENT_TYPE_HTML) $this->error = $response;
            return false;
        }
        //no errors
        return $file;
    }

    /**
     * get status
     *
     * @param  numeric       $awb    numarul de awb
     *
     *
     * @throws
     */

    public function awbStatus($awb)
    {
        $this->apiStart('GET');
        curl_setopt($this->ch, CURLOPT_HTTPHEADER, array('Authorization: Basic '.base64_encode($this->user_passwd),'Content-Type: '.self::CONTENT_TYPE_JSON));
        curl_setopt($this->ch, CURLOPT_URL, $this->url.self::URL_AWB_STATUS.$awb);

        $response = curl_exec($this->ch);
        $response_info = curl_getinfo($this->ch);
        $this->total_time = $response_info['total_time'];
        $this->size_download = $response_info['size_download'];

        $this->apiStop();
        // Response HTTP Status Code
        if (isset($response_info['http_code']) && ($response_info['http_code'] == 400 || $response_info['http_code'] == 401 || $response_info['http_code'] == 404)) {
            if($response_info['content_type'] == self::CONTENT_TYPE_JSON)
            {
                $json_response = json_decode($response,true);
                $this->error = $json_response['message'];
            }
            else if($response_info['content_type'] == self::CONTENT_TYPE_HTML) $this->error = $response;
            return false;
        }
        //no errors
        $json_response = json_decode($response,true);
        $this->lastDataStatus = $json_response['data'];
        $this->lastStatus = $json_response['status'];
        $this->lastDataDetalii = '';
        $this->lastEvtDetalii = '';
        $this->lastCentruDetalii = '';
        if(isset($json_response['detalii']) && is_array($json_response['detalii']))
        {
            $this->detalii = true;
            $arr_detalii = $json_response['detalii'];
            //Detalii
            $this->lastDataDetalii = $arr_detalii['data'];
            $this->lastEvtDetalii = $arr_detalii['eveniment'];
            $this->lastCentruDetalii = $arr_detalii['centru'];

        }
        return $this->lastStatus;
    }

    /**
     * @param $identifier
     * @param $pickupId
     * @return void
     */
    public function getAwbDocument($identifier, $pickupId)
    {
        return $this->awbPrint($identifier);


    }

    /**
     * @param $url
     * @param $request
     * @return array|bool|mixed|string
     */
    public function httpGet($url, $request = "GET")
    {
        $curl = curl_init();
        $debug = "";
        curl_setopt_array($curl, array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => $request,
            CURLOPT_HTTPHEADER => array(
                "Authorization: Basic ".$this->_accesstoken,
                "Content-Type: application/json"
            )
        ));

        $response = curl_exec($curl);
        $err = curl_error($curl);



        curl_close($curl);
        $debug .= "\n{$request}:\n".$url."\n";
        $debug .= "\nRES:\n".$response."\n=======";
        $debug .= "\nERR:\n".$err."\n=======";
        if($this->_debug) {
            Mage::log($debug, true,  'dsc_ship.log');
        }

        if($response == 'Access denied'){
            return json_encode(array('message'=>$response));
        }

        $array = json_decode($response, true);

        if(count($array) && ($array['rezultate'] || $array['status'])){
            header('Content-Type: application/json');
            return $array;
        }

        if(count($array)){
            header('Content-Type: application/json');
            return array('message' => $array['message']);
        }

        return $response;
    }


    public function __get($property)
    {
        if($property == 'awb') return $this->awb;
        else if($property == 'totalNet') return $this->totalNet;
        else if($property == 'error') return $this->error;
        else if($property == 'baza') return $this->baza;
        else if($property == 'costKm') return $this->costKm;
        else if($property == 'costGreutate') return $this->costGreutate;
        else if($property == 'costAsigurare') return $this->costAsigurare;
        else if($property == 'esteTarifStandard') return $this->esteTarifStandard;
        else if($property == 'tva') return $this->tva;
        else if($property == 'total_time') return $this->total_time;
        else if($property == 'size_download') return $this->size_download;
        else if($property == 'borderou') return $this->borderou;
        else if($property == 'nrExpeditii') return $this->nrExpeditii;
        else if($property == 'lastDataStatus') return $this->lastDataStatus;
        else if($property == 'lastStatus') return $this->lastStatus;
        else if($property == 'detalii') return $this->detalii;
        else if($property == 'lastDataDetalii') return $this->lastDataDetalii;
        else if($property == 'lastEvtDetalii') return $this->lastEvtDetalii;
        else if($property == 'lastCentruDetalii') return $this->lastCentruDetalii;
        throw new Exception('Proprietate '.$property.' invalida !');
    }

    /**
     * Converts all accent characters to ASCII characters.
     *
     * If there are no accent characters, then the string given is just returned.
     *
     * @param string $string Text that might have accent characters
     * @return string Filtered string with replaced "nice" characters.
     */
    public function remove_accents($string) {
        if ( !preg_match('/[\x80-\xff]/', $string) )
            return $string;

        if ($this->_seems_utf8($string)) {
            $chars = array(
                // Decompositions for Latin-1 Supplement
                chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
                chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
                chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
                chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
                chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
                chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
                chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
                chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
                chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
                chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
                chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
                chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
                chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
                chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
                chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
                chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
                chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
                chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
                chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
                chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
                chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
                chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
                chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
                chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
                chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
                chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
                chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
                chr(195).chr(191) => 'y',
                // Decompositions for Latin Extended-A
                chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
                chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
                chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
                chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
                chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
                chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
                chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
                chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
                chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
                chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
                chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
                chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
                chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
                chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
                chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
                chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
                chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
                chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
                chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
                chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
                chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
                chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
                chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
                chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
                chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
                chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
                chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
                chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
                chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
                chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
                chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
                chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
                chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
                chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
                chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
                chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
                chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
                chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
                chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
                chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
                chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
                chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
                chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
                chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
                chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
                chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
                chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
                chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
                chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
                chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
                chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
                chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
                chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
                chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
                chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
                chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
                chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
                chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
                chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
                chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
                chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
                chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
                chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
                chr(197).chr(190) => 'z', chr(197).chr(191) => 's',
                // Euro Sign
                chr(226).chr(130).chr(172) => 'E',
                // GBP (Pound) Sign
                chr(194).chr(163) => '');

            $string = strtr($string, $chars);
        } else {
            // Assume ISO-8859-1 if not UTF-8
            $chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
                .chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
                .chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
                .chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
                .chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
                .chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
                .chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
                .chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
                .chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
                .chr(252).chr(253).chr(255);

            $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";

            $string = strtr($string, $chars['in'], $chars['out']);
            $double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
            $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
            $string = str_replace($double_chars['in'], $double_chars['out'], $string);
        }

        return $string;
    }

    private function _seems_utf8($str)
    {
        $length = strlen($str);
        for ($i=0; $i < $length; $i++) {
            $c = ord($str[$i]);
            if ($c < 0x80) $n = 0; # 0bbbbbbb
            elseif (($c & 0xE0) == 0xC0) $n=1; # 110bbbbb
            elseif (($c & 0xF0) == 0xE0) $n=2; # 1110bbbb
            elseif (($c & 0xF8) == 0xF0) $n=3; # 11110bbb
            elseif (($c & 0xFC) == 0xF8) $n=4; # 111110bb
            elseif (($c & 0xFE) == 0xFC) $n=5; # 1111110b
            else return false; # Does not match any model
            for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
                if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))
                    return false;
            }
        }
        return true;
    }



}

