<?php
// Cancelamento de NFe - Focus NFe API v2 (compatível com PHP 5.6+)
// - Substitui endpoint legado /nfe2/* (token na query + YAML) por API v2 (Basic Auth + JSON)

// DESCOMENTE para diagnosticar rapidamente erro 500
// ini_set('display_errors', '1');
// ini_set('display_startup_errors', '1');
// error_reporting(E_ALL);

require 'conectar.php';

$chave = isset($_POST['chave']) ? trim($_POST['chave']) : '';
$texto = isset($_POST['texto']) ? trim($_POST['texto']) : ''; // justificativa

if ($chave === '') {
    die("Parâmetro 'chave' não informado.");
}

$rs_nfe = $conn->query("SELECT * FROM notas WHERE chave = ?", array($chave));
$row = $conn->fetch_assoc($rs_nfe);

if (!$row) {
    die('Nota não encontrada para a chave informada.');
}

$rs_licenca = $conn->query("SELECT * FROM licencas WHERE id_licencas = ?", array($row['id_licencas']));
$licenca = $conn->fetch_assoc($rs_licenca);

if (!$licenca) {
    die('Licença não encontrada para a nota informada.');
}

if ($row['st_nota'] != 'F') {
    echo 'Esta nota não está Finalizada';
    exit;
}

// ==================================================
// API V2 - FocusNFe (Basic Auth)
// ==================================================
$login = $licenca['token'];
$password = '';
$server = 'https://api.focusnfe.com.br';
// $server = 'https://homologacao.focusnfe.com.br';

// Aqui você vinha usando a "chave" como referência também no corrige_nfe.php
$ref = $chave;

function http_request($method, $url, $login, $password, $payloadJson) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_USERPWD, $login . ':' . $password);

    $headers = array('Accept: application/json');
    if ($payloadJson !== null) {
        $headers[] = 'Content-Type: application/json; charset=utf-8';
        curl_setopt($ch, CURLOPT_POSTFIELDS, $payloadJson);
    }
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $body = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $err = curl_error($ch);

    curl_close($ch);

    return array($httpCode, $body, $err);
}

// ---------------------------
// 1) Dispara cancelamento
// ---------------------------
// SEFAZ pede justificativa >= 15 caracteres
$len = function_exists('mb_strlen') ? mb_strlen($texto, 'UTF-8') : strlen($texto);
if ($len < 15) {
    echo "A justificativa deve conter no mínimo 15 caracteres (SEFAZ).<br>";
    echo "Informe um texto maior para cancelar.<br>";
    exit;
}

$cancelUrl = $server . '/v2/nfe/' . rawurlencode($ref);
$payload = json_encode(array('justificativa' => $texto), JSON_UNESCAPED_UNICODE);

list($codeCancel, $bodyCancel, $errCancel) = http_request('DELETE', $cancelUrl, $login, $password, $payload);

echo 'STATUS: ' . $codeCancel . '<br>';
echo 'BODY: ' . htmlspecialchars($bodyCancel, ENT_QUOTES, 'UTF-8') . '<br><br>';
if ($errCancel) {
    echo 'ERRO CURL: ' . htmlspecialchars($errCancel, ENT_QUOTES, 'UTF-8') . '<br>';
}

// Log no banco
$logPrefix = isset($row['tx_cancelamento']) ? $row['tx_cancelamento'] : '';
$logAppend = '<br>>> CANCELAMENTO em ' . date('d/m/Y H:i:s') . ' | HTTP ' . $codeCancel;
$logAppend .= '<br>' . nl2br(htmlspecialchars($bodyCancel, ENT_QUOTES, 'UTF-8'));

$conn->update(
    'notas',
    array('tx_cancelamento' => $logPrefix . $logAppend),
    'chave = ?',
    array($chave)
);

// ---------------------------
// 2) Consulta até finalizar
// ---------------------------
$consultaUrl = $server . '/v2/nfe/' . rawurlencode($ref);

$status = 'processando_cancelamento';
$tentativas = 0;
$maxTentativas = 30; // ~1 min com sleep(2)
$response = null;

while ($status === 'processando_cancelamento' && $tentativas < $maxTentativas) {
    $tentativas++;

    list($codeSt, $bodySt, $errSt) = http_request('GET', $consultaUrl, $login, $password, null);

    $response = json_decode($bodySt, true);
    if (is_array($response) && isset($response['status'])) {
        $status = $response['status'];
    } else {
        $status = 'erro_consulta';
    }

    echo 'Body : ' . htmlspecialchars($bodySt, ENT_QUOTES, 'UTF-8') . '<br>';
    echo 'Result : ' . $codeSt . '<br>';
    echo 'Status : ' . htmlspecialchars($status, ENT_QUOTES, 'UTF-8') . '<br><br>';

    if ($status === 'processando_cancelamento') {
        sleep(2);
    }
}

echo 'status ====> ' . htmlspecialchars($status, ENT_QUOTES, 'UTF-8');

// ---------------------------
// 3) Grava resultado
// ---------------------------
if ($status === 'cancelado') {

    // Alguns campos variam conforme o retorno; guardamos se existirem
    $caminhoDanfe = isset($response['caminho_danfe']) ? $response['caminho_danfe'] : '';
    $caminhoXml = '';
    if (isset($response['caminho_xml_nota_fiscal'])) {
        $caminhoXml = $response['caminho_xml_nota_fiscal'];
    } elseif (isset($response['caminho_xml'])) {
        $caminhoXml = $response['caminho_xml'];
    }
    $caminhoXmlCancel = isset($response['caminho_xml_cancelamento']) ? $response['caminho_xml_cancelamento'] : '';

    $obs = (isset($row['tx_cancelamento']) ? $row['tx_cancelamento'] : '') .
        '<br>>>> ' . date('d/m/Y H:i:s') . ' - ' . $status;

    // Atenção: host de download pode não ser o mesmo do server da API.
    // Mantive o mesmo padrão do seu corrige_nfe.php (ele usa producao.acrasnfe...).
    if ($caminhoDanfe !== '') {
        $obs .= "<br><a href='" . $server . $caminhoDanfe . "' target='_blank'>Arquivo DANFE</a>";
    }
    if ($caminhoXml !== '') {
        $obs .= "<br><a href='" . $server . $caminhoXml . "' target='_blank'>Arquivo XML</a>";
    }
    if ($caminhoXmlCancel !== '') {
        $obs .= "<br><a href='" . $server . $caminhoXmlCancel . "' target='_blank'>XML Cancelamento</a>";
    }

    $conn->update('notas', array(
        'tx_cancelamento' => $obs,
        'st_nota' => 'C'
    ), 'chave = ?', array($chave));

} else {

    echo '<br><br>FALHA AO TRANSMITIR<br><br>';
    echo 'URL CC: ' . htmlspecialchars($cancelUrl, ENT_QUOTES, 'UTF-8') . '<br><br>';
    echo 'URL ST: ' . htmlspecialchars($consultaUrl, ENT_QUOTES, 'UTF-8') . '<br><br>';

    echo '<pre>';
    var_dump($response);
    echo '</pre>';
}

$prg = '../Notas_Finalizadas.php';
echo '<input type="button" onClick="window.location.href = \'{$prg}\'" value="Voltar">';

?>
