<?
error_reporting(0);

/*
ob_start();
ini_set('display_errors', '0');  
ini_set("soap.wsdl_cache_enabled", '0');
ini_set('soap.wsdl_cache_ttl'    , '0');
set_error_handler('var_dump', 0);
error_clear_last();
*/


@include_once "../connect.php";

$meusCEPS = new meusCEPS();

/* Faz consulta LOCAL, se não existir utiliza o WS dos correios */
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
	  if (isset($_GET['key'])) {
		$key = $_GET['key'];
		$msg = array();

		$key = substr("00000000" . preg_replace("/[^0-9]/", "", $key), -8);
		$cep = $meusCEPS->buscaCEP($key);

		/* CEP não encontrado, mostra JSON e sai */
		if(count($cep)==0){
			$cep['error'] = "Erro! CEP $key não encontrado!";
		}

		// Estes cabecalhos sao necessarios no CORS
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: GET');
		header('Content-type: application/json');

		if(!isset($cep['error'])){
		  $cep['id_pais'] = 1;
		}		
		echo json_encode($cep);
		exit;
	  }
}

$minhaLista= $meusCEPS->listarCEPs();

echo "<table border=1>";
echo "<tr><th>CEP</th><th>Endereço</th><th>Bairro</th><th>Cidade</th><th>UF</th></tr>";
foreach($minhaLista as $key=>$campo){
	if($campo['ds_cep']!=""){
		echo "<tr>";
		echo "<td>{$campo['ds_cep']}</td>";
		echo "<td>{$campo['ds_logradouro']}</td>";
		echo "<td>{$campo['ds_bairro']}</td>";
		echo "<td>{$campo['ds_cidade']}</td>";
		echo "<td>{$campo['ds_uf']}</td>";
		echo "</tr>";
	}
}
echo "</table>";


class meusCEPS{
	/* Nome do Banco de Dados */
	private $bd_file_name = "bdceplocal.json";

	public function __get($name) {
		$name = strtolower($name);
        if (isset($this->$name)) {
            return $this->$name;
        } else {
            return false; 
        }
    }

    public function __set($name, $value) {
    	$name = strtolower($name);
        $this->$name = $value;
    }

    public function __construct(){

    	/* Arquivo não encontrado, cria um novo*/
    	/*
    	if(!file_exists($this->bd_file_name)){
    		$this->file = '[{}]';
    	}else{
    		$this->file   = file_get_contents($this->bd_file_name);
    	}
		$this->bd_cep = json_decode($this->file);	// array com todos os CEPS
		$this->st_update = false; 			// controle de alteração do arquivo
		*/
		$this->bd_cep = array();

		$this->timeout = 05; // tempo em segundos
		ini_set('max_execution_time'     , $this->timeout); //300 seconds
		ini_set("default_socket_timeout" , $this->timeout);

		$this->config = array(
        	"trace" => 0, 
            "exception" => 1, 
        	"connection_timeout" => $this->timeout,
        	"cache_wsdl" => WSDL_CACHE_DISK // WSDL_CACHE_BOTH WSDL_CACHE_MEMORY
        );

        $this->config_init = array(
        	"trace"    => 0,
        	"exception"=> 0,
        	"connection_timeout" => 1,
        	"cache_wsdl" => WSDL_CACHE_DISK // WSDL_CACHE_BOTH WSDL_CACHE_MEMORY
        );

        $this->address = 'https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl';   

        $client = new SoapClient($this->address, $this->config_init);
        unset($client);

        /*
        $status = $client->buscaDataAtual();

        echo "<pre>";
        print_r($status);
        echo "</pre>";
        */
    }


    /* Gatilho de consulta ao bando de dados de CEP */
    function getSQL($consulta){
	  global $conexao;

	    $ar_retorno = array();
	    $resultado = mysqli_query($conexao, $consulta) or die ($erro = mysqli_error($conexao));
		
	    if (mysqli_num_rows($resultado)>0) {
	          while ($registro = mysqli_fetch_assoc($resultado)){
	            array_push($ar_retorno, $registro);
	          }
	    }
	    return $ar_retorno;
	  }


    /* Limpa a String sem caracteres especiais e espaço */
    function limparString($p_valor){
	    $sem_especial = preg_replace('{\W}', '', preg_replace('{ +}', '_', strtr(
	        utf8_decode(html_entity_decode($p_valor)),
	        utf8_decode('ÀÁÃÂÉÊÍÓÕÔÚÜÇÑàáãâéêíóõôúüçñ'),
	        'AAAAEEIOOOUUCNaaaaeeiooouucn')));

	    return preg_replace('{_+}', ' ', $sem_especial);
    }


	/* Verifica se CEP existe */
	function buscaCEP($p_cep){
		$sql = "select c.*, m.ds_codigo_ibge, m.id as id_municipio
				from   erpc_cep c 
				left join 
					   erpc_municipios m 
				on 	   c.ds_cidade = m.ds_municipio and c.ds_uf = m.ds_uf where ds_cep='$p_cep'";
		$p_return = $this->getSQL($sql);

		/* Consulta WS dos correios para obter os dados */
		if(count($p_return)==0){
			$ws = $this->consultaCEPWS($p_cep);

			/* Se retornou salva no arquivo */
			if(count($ws)){
				$p_include = array(
						"ds_cep" 		=> strtoupper($this->limparString($p_cep)),
						"ds_logradouro" => strtoupper($this->limparString($ws['end'])),
						"ds_bairro" 	=> strtoupper($this->limparString($ws['bairro'])),
						"ds_cidade" 	=> strtoupper($this->limparString($ws['cidade'])),
						"ds_uf" 		=> strtoupper($this->limparString($ws['uf']))
					);

				$this->incluirCEP($p_include);
				unset($p_return);
				$p_return = $this->getSQL($sql)[0];
			}
		}else{
			$p_return = $p_return[0];
		}
		return $p_return;
	}

	/* Consulta os CEPS salvos no Banco de dados local */
	function listarCEPS(){
		$sql = "select * from erpc_cep order by 1";
		$p_return = $this->getSQL($sql);
		
		$this->bd_cep = $p_return;
		return $this->bd_cep;
	}

	/* Inclui o CEP na lista e BD */
	function incluirCEP($p_incluir){
		global $conexao;

		/* Faz a inclusão do novo CEP */
		array_push($this->bd_cep, $p_incluir);

		/* Faz a inclusão no banco de dados */
		$sql = "insert into erpc_cep(ds_cep, ds_logradouro, ds_bairro, ds_cidade, ds_uf)values('{$p_incluir['ds_cep']}','{$p_incluir['ds_logradouro']}','{$p_incluir['ds_bairro']}','{$p_incluir['ds_cidade']}','{$p_incluir['ds_uf']}')";

		// echo $sql;
		/*
	    $stmt = mysqli_prepare($conexao, $sql) or die(mysqli_error($conexao) . '<br />' . $sql);
		mysqli_stmt_execute($stmt) or die(mysqli_error($conexao));
		*/
		mysqli_query($conexao, $sql) or die(mysqli_error($conexao));
		return true;
	}

	/* Grava o novo arquivo JSON, se houve alteração */
	function atualizarArquivo(){
		if($this->st_update==true){
			$string_json = json_encode($this->bd_cep);

			$bd_cep_converted = preg_replace("[^a-zA-Z0-9_]", "", strtr($string_json, "áàãâéêíóôõúüçÁÀÃÂÉÊÍÓÔÕÚÜÇ ", "aaaaeeiooouucAAAAEEIOOOUUC_"));

			$myfile = fopen($this->bd_file_name, "w+") or die("Unable to open file!");
		    //header( 'Content-type: text/xml' ); preg_replace("/(\t+)/", "", $r_xml)
		    fwrite($myfile, $bd_cep_converted);
		    fclose($myfile);
		    return true;
		}
	}


	/* Consulta o CEP no Web Server e Retorna um Array */
  	private function consultaCEPWS($ds_cep, $bo_nova_tentativa = true){
    
    $ar_cep = array();
    $ds_cep =  substr("00000000" . preg_replace("/[^0-9]/", "", $ds_cep), -8);

        /* - Faz consulta ao WEB Server do Correios, se OK inclui em nosso BD */
      try{
       
        $client = new SoapClient($this->address, $this->config);

        $cep = $client->consultaCEP(['cep' => $ds_cep]);

        $return = json_decode(json_encode($cep), True);//  (array)$cep;

        /* 3 Removendo o Complemento2 para Complemento */
        $return['return']['complemento'] .= $return['return']['complemento2'];
        unset($return['return']['complemento2']);

        unset($client);

        $ar_cep = $return['return'];
        // $ar_cep['ds_mensagem']='';

      }catch(Exception $e) {
        // $ar_cep['ds_mensagem'] = $e->getMessage(); 
        // addError($e->getMessage() . " $address"); 
        // echo $e->getMessage(); 
        $GLOBALS['errors'][] = $e;
      }
      return $ar_cep;   
  	}

}

?>