<?php
/**
 * Webhook para recebimento de notificações de pagamento PIX do Sicoob.
 * Versão com logging aprimorado e validação de método.
 */

// --- Início do Bloco de Depuração ---
$logFile = 'webhook_pix.log';
$logData = "==================================================\n";
$logData .= date('Y-m-d H:i:s') . " --- Nova Requisição Recebida ---\n";
$logData .= "Método: " . ($_SERVER['REQUEST_METHOD'] ?? 'N/A') . "\n";

// Log dos cabeçalhos da requisição
$headers = [];
if (function_exists('getallheaders')) {
    $headers = getallheaders();
    $logData .= "Cabeçalhos: " . json_encode($headers, JSON_PRETTY_PRINT) . "\n";
} else {
    $logData .= "Cabeçalhos: (função getallheaders não disponível)\n";
}

// Log do corpo da requisição (raw input)
$requestBody = file_get_contents('php://input');
$logData .= "Corpo da Requisição (php://input):\n" . $requestBody . "\n";

// Log do array $_POST (para o caso de Content-Type incorreto)
$logData .= "\$_POST data: " . json_encode($_POST, JSON_PRETTY_PRINT) . "\n";
$logData .= "--------------------------------------------------\n\n";

file_put_contents($logFile, $logData, FILE_APPEND);
// --- Fim do Bloco de Depuração ---

// Validação do Webhook (Sicoob envia um GET para validar a URL)
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    http_response_code(200);
    // Adicionar este cabeçalho é uma boa prática para respostas sem corpo.
    header('Content-Length: 0');
    exit;
}

// Garante que apenas requisições POST sejam processadas daqui em diante
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405); // Method Not Allowed
    header('Content-Type: application/json');
    echo json_encode(['status' => 'error', 'message' => 'Método não permitido. Apenas POST é aceito.']);
    exit;
}

// Se o corpo da requisição estiver vazio, não há o que processar.
if (empty($requestBody)) {
    http_response_code(400); // Bad Request
    header('Content-Type: application/json');
    echo json_encode(['status' => 'error', 'message' => 'Corpo da requisição vazio.']);
    exit;
}

// 3. Inclui os arquivos de inicialização do sistema
define('_VALID_PHP', true);
require_once('../../../../init.php');

// 5. Decodifica o JSON recebido
$data = json_decode($requestBody, true);
$logData = "\nCorpo da Requisição (2) (php://input) -- ".date('Y-m-d H:i:s')."--:\n" . $requestBody . "\n";
file_put_contents($logFile, $logData, FILE_APPEND);

// 6. Verifica se o JSON é válido e se contém a informação do PIX
if (json_last_error() !== JSON_ERROR_NONE || !isset($data['pix'])) {
    http_response_code(400); // Requisição inválida
    file_put_contents($logFile, date('Y-m-d H:i:s') . " - ERRO: Payload JSON inválido ou sem a chave 'pix'.\n", FILE_APPEND);
    header('Content-Type: application/json');
    echo json_encode(['status' => 'error', 'message' => 'Payload inválido ou sem a chave "pix".']);
    exit;
}

// 7. Processa cada confirmação de PIX recebida
try {
    foreach ($data['pix'] as $pix) {
        if (isset($pix['txid'])) {
            $txid = $pix['txid'];
            file_put_contents($logFile, date('Y-m-d H:i:s') . " - Processando txid: {$txid}\n", FILE_APPEND);
            $pagamento_pix->confirmarPagamentoPix($txid);
        }
    }
    // 8. Responde ao Sicoob com status 200 OK para confirmar o recebimento
    http_response_code(200);
    header('Content-Type: application/json');
    echo json_encode(['status' => 'success', 'message' => 'Webhook processado.']);
} catch (Exception $e) {
    file_put_contents($logFile, date('Y-m-d H:i:s') . " - EXCEÇÃO: " . $e->getMessage() . "\n", FILE_APPEND);
    http_response_code(500); // Erro interno do servidor
}