<?php
require_once('tracking.php');

class Correios extends Tracking{   

    private $wsdl      = 'https://webservice.correios.com.br/service/rastro/Rastro.wsdl' ;
    private $tipo      = 'L'   ;
    private $resultado = 'T'   ;
    private $idioma    = '101' ;
	
	protected $statusCorreios = array(
		'_tracking_status_entregue'     => array('BDE' => 1, 'BDI' => 1, 'BDR' => 1),
		'_tracking_status_saiu_entrega' => array('OEC' => 0)
	);

	protected $statusCorreiosFinal = array(
		'_tracking_status_entregue' => array('BDE' => [1,23], 'BDI' => [1,23], 'BDR' => [1,23])
	);
	
    public function __construct(){}
     
    public function getObjectTracking($object){

        try{

            if(!$this->getAutentication()){
                throw new Exception("Modulo não autenticado");
            }

            $_param = array(
                'usuario'   => $this->usuario,
                'senha'     => $this->senha,
                'tipo'      => $this->tipo,
                'resultado' => $this->resultado,
                'lingua'    => $this->idioma,
                'objetos'   => trim($object)
            );
   
            $client = new SoapClient($this->wsdl);
            $results = $client->buscaEventos($_param);

            if(is_object($results) && isset($results->return->objeto->erro)){
                $error = $results->return->objeto->erro.': '.$results->return->objeto->numero;
                throw new Exception($error);
            }

            $this->eventos = ($results->return->qtd == 1) ? $results->return->objeto : $results->return ;                
        }catch (Exception $e){            
            throw $e;
        }

    }

    public function getEvents($data = array()){
        if($this->eventos && $this->getAutentication()){		
			$eventData	= array();
			if(is_object($this->eventos) && property_exists($this->eventos,'objeto')){
				$eventData = array_map(function($array) use (&$data){  				
					if(!isset($array->erro)){						
						return array(
							'order_tracking_id' => (in_array(trim($array->numero), $data['tracking_code'])) ? array_search(trim($array->numero), $data['tracking_code']) : false,
							'order_id' => (in_array(trim($array->numero), $data['order_id'])) ? array_search(trim($array->numero), $data['order_id']) : false,
							'evento' => array_map(function($event){
								return array(
									'tipo'      => $event->tipo,
									'status'    => $event->status,
									'data'      => $event->data,
									'hora'      => $event->hora,
									'descricao' => $event->descricao,
									'history'   => $this->getHistory(['tipo' => $event->tipo, 'status'=> $event->status]),
									'finally'	=> $this->getFinally(['tipo' => $event->tipo, 'status'=> $event->status])	
								);	
							}, $array->evento)
						);					
					}else{
						return false;
					}
				}, $this->eventos->objeto);					
			}elseif(is_object($this->eventos) && property_exists($this->eventos,'evento')){		
				$eventData[0] = array(
					'order_tracking_id' => (in_array(trim($this->eventos->numero), $data['tracking_code'])) ? array_search(trim($this->eventos->numero), $data['tracking_code']) : false,
					'order_id' => (in_array(trim($this->eventos->numero), $data['order_id'])) ? array_search(trim($this->eventos->numero), $data['order_id']) : false,
					'evento' => array_map(function($event){
						return array(
							'tipo'      => $event->tipo,
							'status'    => $event->status,
							'data'      => $event->data,
							'hora'      => $event->hora,
							'descricao' => $event->descricao,
							'history'    => $this->getHistory(['tipo' => $event->tipo, 'status'=> $event->status]),
							'finally'    => $this->getFinally(['tipo' => $event->tipo, 'status'=> $event->status])
						);	
					}, $this->eventos->evento)					
				);							
			}		
			return $eventData;
        }
		return false;
	}
	
	public function getHistory($data = array()){
		
		foreach($this->statusCorreios as $key => $statusCorreios){
			if(array_key_exists($data['tipo'], $statusCorreios) && in_array($data['status'], $statusCorreios)){
				return true;
			}			
		}
		
		return false ;			
	}

	public function getFinally($data = array()){
		$retorno = false;
		foreach($this->statusCorreiosFinal as $key => $statusCorreioFinal){
			if(array_key_exists($data['tipo'], $statusCorreioFinal)){
				$retorno = array_map(function ($array) use (&$data){
					return in_array($data['status'], $array) ? true : false;
				}, $statusCorreioFinal);				
			}			
		}
	
		return $retorno ;			
	}	

   
}