<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
require_once './api/nfephp/bootstrap.php';
require_once 'connect.php';

use NFePHP\NFe\ToolsNFe;

$nfe = new ToolsNFe('./api/nfephp/config/config.json');
$nfe->setModelo('55');

/*
// OK EM 04/05 $chNFe = '35180205761098000113550010000021721000047205';
// $chNFe = '35180205761098000113550010000021731000067696';
// $chNFe = '35180405761098000113550010000023181000011352';
// $chNFe = '35180405761098000113550010000023761000074854';
// $chNSU = '000000000000024';
// $chNFe = '35180705761098000113550010000027691000111758';
*/

	function getDownloadXML($idNfe, $chNFe){
		global $nfe;
		global $conexao;

		$p_return = false;

		$tpAmb = '1'; // Sempre Ambiente de Produção;
		$cnpj = $nfe->aConfig['cnpj'];

		$aResposta = array();

		$resp = $nfe->sefazDownloadXML($chNFe, $tpAmb, $cnpj, $aResposta);

		/*
		echo '<br><br><PRE>';
		echo htmlspecialchars($nfe->soapDebug);
		echo '</PRE><BR>';
		print_r($aResposta);
		echo "<br>";
		*/

		if(count($aResposta)>0){
			$doc = new DOMDocument('1.0', 'utf-8');
		    $doc->loadXML( $resp);
		    $XMLresults= $doc->getElementsByTagName("docZip");
		    $output    = $XMLresults->item(0)->nodeValue;

		    if($output!=""){
				$zipdata = base64_decode($output);
				$zip = '<?xml version="1.0" encoding="utf-8"?>' . pGunzip1($zipdata);

				/*
				$filename = "xml/{$chNfe}_AutoDownload.xml";
				file_put_contents($filename, $zip);
					chmod($filename, 0777);
					*/
				
				$ds_xml = base64_encode($zip);
				$sql = "update 	erpc_documentos_entrada 
							set cd_status_nfe='100', ds_status_nfe='Download Auto XML', id_status_xml_importado=2, ds_xml='$ds_xml' 
						where id = $idNfe";

				$stmt = mysqli_prepare($conexao, $sql) or die(mysqli_error($conexao) . '<br />' . $sql);
					$ok   = mysqli_stmt_execute($stmt) or die(mysqli_error($conexao));

				$p_return = true;
			}
		}
		return $p_return;	
	}

	/**
     * gunzip1
     * Descompacta strings GZIP
     *
     * @name gunzip1
     * @param string $data Dados compactados com gzip
     * @return mixed
     */
    function pGunzip1($data)
    {
        $len = strlen($data);
        if ($len < 18 || strcmp(substr($data, 0, 2), "\x1f\x8b")) {
            $msg = "Não é dado no formato GZIP.";
            $this->pSetError($msg);
            return false;
        }
        $method = ord(substr($data, 2, 1));  // metodo de compressão
        $flags  = ord(substr($data, 3, 1));  // Flags
        if ($flags & 31 != $flags) {
            $msg = "Não são permitidos bits reservados.";
            $this->pSetError($msg);
            return false;
        }
        // NOTA: $mtime pode ser negativo (limitações nos inteiros do PHP)
        $mtime = unpack("V", substr($data, 4, 4));
        $mtime = $mtime[1];
        $headerlen = 10;
        $extralen  = 0;
        $extra     = "";
        if ($flags & 4) {
            // dados estras prefixados de 2-byte no cabeçalho
            if ($len - $headerlen - 2 < 8) {
                $msg = "Dados inválidos.";
                $this->pSetError($msg);
                return false;
            }
            $extralen = unpack("v", substr($data, 8, 2));
            $extralen = $extralen[1];
            if ($len - $headerlen - 2 - $extralen < 8) {
                $msg = "Dados inválidos.";
                $this->pSetError($msg);
                return false;
            }
            $extra = substr($data, 10, $extralen);
            $headerlen += 2 + $extralen;
        }
        $filenamelen = 0;
        $filename = "";
        if ($flags & 8) {
            // C-style string
            if ($len - $headerlen - 1 < 8) {
                $msg = "Dados inválidos.";
                $this->pSetError($msg);
                return false;
            }
            $filenamelen = strpos(substr($data, $headerlen), chr(0));
            if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
                $msg = "Dados inválidos.";
                $this->pSetError($msg);
                return false;
            }
            $filename = substr($data, $headerlen, $filenamelen);
            $headerlen += $filenamelen + 1;
        }
        $commentlen = 0;
        $comment = "";
        if ($flags & 16) {
            // C-style string COMMENT data no cabeçalho
            if ($len - $headerlen - 1 < 8) {
                $msg = "Dados inválidos.";
                $this->pSetError($msg);
                return false;
            }
            $commentlen = strpos(substr($data, $headerlen), chr(0));
            if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
                $msg = "Formato de cabeçalho inválido.";
                $this->pSetError($msg);
                return false;
            }
            $comment = substr($data, $headerlen, $commentlen);
            $headerlen += $commentlen + 1;
        }
        $headercrc = "";
        if ($flags & 2) {
            // 2-bytes de menor ordem do CRC32 esta presente no cabeçalho
            if ($len - $headerlen - 2 < 8) {
                $msg = "Dados inválidos.";
                $this->pSetError($msg);
                return false;
            }
            $calccrc = crc32(substr($data, 0, $headerlen)) & 0xffff;
            $headercrc = unpack("v", substr($data, $headerlen, 2));
            $headercrc = $headercrc[1];
            if ($headercrc != $calccrc) {
                $msg = "Checksum do cabeçalho falhou.";
                $this->pSetError($msg);
                return false;
            }
            $headerlen += 2;
        }
        // Rodapé GZIP
        $datacrc = unpack("V", substr($data, -8, 4));
        $datacrc = sprintf('%u', $datacrc[1] & 0xFFFFFFFF);
        $isize = unpack("V", substr($data, -4));
        $isize = $isize[1];
        // decompressão
        $bodylen = $len-$headerlen-8;
        if ($bodylen < 1) {
            $msg = "BUG da implementação.";
            $this->pSetError($msg);
            return false;
        }
        $body = substr($data, $headerlen, $bodylen);
        $data = "";
        if ($bodylen > 0) {
            switch ($method) {
                case 8:
                    // Por hora somente é suportado esse metodo de compressão
                    $data = gzinflate($body, null);
                    break;
                default:
                    $msg = "Método de compressão desconhecido (não suportado).";
                    $this->pSetError($msg);
                    return false;
            }
        }  // conteudo zero-byte é permitido
        // Verificar CRC32
        $crc   = sprintf("%u", crc32($data));
        $crcOK = $crc == $datacrc;
        $lenOK = $isize == strlen($data);
        if (!$lenOK || !$crcOK) {
            $msg = ( $lenOK ? '' : 'Verificação do comprimento FALHOU. ').( $crcOK ? '' : 'Checksum FALHOU.');
            $this->pSetError($msg);
            return false;
        }
        return $data;
    }//fim gunzip1