<?php
/**
 * retorno_pix.php — Webhook público chamado pelo Gateway (Mercado Pago/Asaas)
 * quando um pagamento é confirmado.
 *
 * Configure esta URL no painel do gateway como "URL de notificação".
 */

require_once __DIR__ . '/../core/db_helper.php';
require_once __DIR__ . '/../core/auth.php';
require_once __DIR__ . '/../core/notificacoes.php';
require_once __DIR__ . '/../core/IntegracaoService.php';

header('Content-Type: application/json; charset=utf-8');

$config = db_read('config');
$secretEsperado = $config['gateway_pix']['webhook_secret'] ?? '';

$corpoRaw = file_get_contents('php://input');
$payload = json_decode($corpoRaw, true) ?? [];

// Validação simples de assinatura (ajuste conforme o gateway real: Mercado
// Pago usa x-signature no header; Asaas usa um token customizado).
$assinaturaRecebida = $_SERVER['HTTP_X_WEBHOOK_SECRET'] ?? ($_GET['secret'] ?? '');
if ($secretEsperado && !hash_equals($secretEsperado, (string) $assinaturaRecebida)) {
    http_response_code(401);
    echo json_encode(['erro' => 'Assinatura inválida.']);
    exit;
}

// Extrai o external_reference (ID do cliente) e status do pagamento.
// Estrutura de exemplo compatível com Mercado Pago (ajuste para o gateway usado).
$idPagamento = $payload['data']['id'] ?? $payload['id'] ?? null;
$statusPagamento = $payload['action'] ?? $payload['status'] ?? null;
$referenciaCliente = $payload['external_reference'] ?? $_GET['cliente_id'] ?? null;

if (!$referenciaCliente) {
    http_response_code(400);
    echo json_encode(['erro' => 'Referência do cliente não informada.']);
    exit;
}

$clienteAtualizado = null;

db_update('clientes', function (&$clientes) use ($referenciaCliente, &$clienteAtualizado) {
    foreach ($clientes as &$c) {
        if ($c['id'] === $referenciaCliente) {
            $dias = 30;
            if (!empty($c['plano_meses'])) {
                $dias = ((int) $c['plano_meses']) * 30;
            }

            $baseVencimento = new DateTime($c['vencimento'] ?? 'today');
            $horaOriginal = (int) $baseVencimento->format('H');
            $minutoOriginal = (int) $baseVencimento->format('i');
            if ($baseVencimento < new DateTime('today')) {
                $baseVencimento = new DateTime('today'); // evita empilhar atraso
                $baseVencimento->setTime($horaOriginal, $minutoOriginal, 0);
            }
            $baseVencimento->modify("+{$dias} days");
            $c['vencimento'] = $baseVencimento->format('Y-m-d H:i:s');

            $c['notificado_3_dias'] = false;
            $c['notificado_no_dia'] = false;
            $c['dias_notificados'] = [];
            $c['status'] = 'Ativo';
            $c['pix_pendente'] = null;

            $clienteAtualizado = $c;
            break;
        }
    }
});

if (!$clienteAtualizado) {
    http_response_code(404);
    echo json_encode(['erro' => 'Cliente não encontrado para esta referência.']);
    exit;
}

$meses = max(1, (int) ($clienteAtualizado['plano_meses'] ?? 1));
$valorRecebido = (float) ($clienteAtualizado['valor'] ?? 0);

// Busca o custo mensal do servidor vinculado para calcular o lucro líquido
$custoServidor = 0.0;
if (!empty($clienteAtualizado['servidor'])) {
    $servidores = db_read('servidores');
    foreach ($servidores as $s) {
        if ($s['nome'] === $clienteAtualizado['servidor']) {
            $custoServidor = (float) ($s['custo_mensal'] ?? 0);
            break;
        }
    }
}
$custoTotalPeriodo = round($custoServidor * $meses, 2);

// Lança entrada financeira automática (e a saída do custo do servidor, se houver)
db_update('financeiro', function (&$financeiro) use ($clienteAtualizado, $idPagamento, $valorRecebido, $custoTotalPeriodo) {
    $financeiro[] = [
        'id' => gerar_id('FIN-'),
        'tipo' => 'entrada',
        'origem' => 'pix_automatico',
        'cliente_id' => $clienteAtualizado['id'],
        'referencia_gateway' => $idPagamento,
        'valor' => $valorRecebido,
        'descricao' => 'Renovação automática via PIX - ' . ($clienteAtualizado['nome'] ?? ''),
        'data' => date('Y-m-d H:i:s'),
    ];
    if ($custoTotalPeriodo > 0) {
        $financeiro[] = [
            'id' => gerar_id('FIN-'),
            'tipo' => 'saida',
            'origem' => 'custo_servidor',
            'cliente_id' => $clienteAtualizado['id'],
            'valor' => $custoTotalPeriodo,
            'descricao' => 'Custo do servidor (' . ($clienteAtualizado['servidor'] ?? '') . ') - ' . ($clienteAtualizado['nome'] ?? ''),
            'data' => date('Y-m-d H:i:s'),
        ];
    }
});

// Dispara confirmação de renovação multicanal
disparar_notificacao_multicanal($clienteAtualizado, 'confirmacao_renovacao');

// Sincroniza a renovação com o provedor externo (se o servidor do cliente
// tiver integração configurada). Falha na integração não deve derrubar o
// webhook do gateway PIX — fica registrada em log/auditoria.
$syncIntegracao = integracao_sincronizar_renovacao_cliente($clienteAtualizado, 'pix_automatico');

auditoria_log('WEBHOOK_PIX', 'PAGAMENTO_CONFIRMADO', "Cliente {$clienteAtualizado['id']} renovado via PIX ({$idPagamento}).");

echo json_encode([
    'ok' => true,
    'cliente_id' => $clienteAtualizado['id'],
    'novo_vencimento' => $clienteAtualizado['vencimento'],
    'integracao_externa' => $syncIntegracao,
]);
