<?php
// api/webhook_pagamentos.php
// Recebe as notificações do Mercado Pago e do Asaas e processa a renovação automática

require_once '../config.php';

// Esconde erros da tela, mas permite logs (O Mercado Pago/Asaas precisa receber status 200/201 limpo)
error_reporting(0);
ini_set('display_errors', 0);

$pdo = getConexaoAtiva();

// 1. IDENTIFICAR O TOKEN DO WEBHOOK
$token_url = $_GET['token'] ?? null;
if (!$token_url) { 
    http_response_code(400); 
    exit('Token não fornecido.'); 
}

// 2. BUSCAR DADOS DO REVENDEDOR/ADMIN DONO DO TOKEN
$stmt_config = $pdo->prepare("SELECT revendedor_id, mp_access_token, asaas_api_key FROM revendedor_configuracoes WHERE webhook_token = ?");
$stmt_config->execute([$token_url]);
$config = $stmt_config->fetch(PDO::FETCH_ASSOC);

if (!$config) {
    http_response_code(403); 
    exit('Token invalido.');
}

$revendedor_id = $config['revendedor_id'];

// 3. CAPTURAR OS DADOS ENVIADOS PELO BANCO (JSON payload)
$json_input = file_get_contents('php://input');
$payload = json_decode($json_input, true);

if (!$payload) {
    // Tenta pegar por GET (Mercado Pago às vezes envia por url params)
    if (isset($_GET['type']) && $_GET['type'] == 'payment' && isset($_GET['data_id'])) {
        $payload = ['type' => 'payment', 'data' => ['id' => $_GET['data_id']]];
    } else {
        http_response_code(200); exit();
    }
}

$status_pago = false;
$identificador_cliente = '';

// =========================================================================
// LÓGICA MERCADO PAGO
// =========================================================================
if ((isset($payload["type"]) && $payload["type"] == "payment") || (isset($payload["topic"]) && $payload["topic"] == "payment")) {
    
    $payment_id = $payload['data']['id'] ?? null;
    if (!$payment_id) { http_response_code(200); exit(); }

    $mp_token = $config['mp_access_token'];
    if (empty($mp_token)) { http_response_code(200); exit('MP nao configurado.'); }

    // Consulta a API do Mercado Pago (via cURL Nativo, sem depender de SDK ou vendor/autoload)
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://api.mercadopago.com/v1/payments/" . $payment_id);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Authorization: Bearer " . $mp_token
    ]);
    $response = curl_exec($ch);
    curl_close($ch);

    $payment_info = json_decode($response, true);

    if (isset($payment_info['status']) && $payment_info['status'] == 'approved') {
        $status_pago = true;
        // O Mercado Pago salva a referência em external_reference
        $identificador_cliente = trim($payment_info['external_reference'] ?? '');
    }
}

// =========================================================================
// LÓGICA ASAAS
// =========================================================================
elseif (isset($payload['event']) && ($payload['event'] == 'PAYMENT_RECEIVED' || $payload['event'] == 'PAYMENT_CONFIRMED')) {
    
    $payment_id = $payload['payment']['id'] ?? null;
    if (!$payment_id) { http_response_code(200); exit(); }

    $asaas_token = $config['asaas_api_key'];
    if (empty($asaas_token)) { http_response_code(200); exit('Asaas nao configurado.'); }

    // Consulta a API do Asaas para ter certeza que não é um payload falso (Segurança)
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://api.asaas.com/v3/payments/" . $payment_id);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "access_token: " . $asaas_token
    ]);
    $response = curl_exec($ch);
    curl_close($ch);

    $payment_info = json_decode($response, true);

    if (isset($payment_info['status']) && ($payment_info['status'] == 'RECEIVED' || $payment_info['status'] == 'CONFIRMED')) {
        $status_pago = true;
        // O Asaas salva a referência em externalReference
        $identificador_cliente = trim($payment_info['externalReference'] ?? '');
    }
}

// =========================================================================
// RENOVAR O CLIENTE NO PAINEL
// =========================================================================
if ($status_pago && !empty($identificador_cliente)) {
    
    try {
        // O identificador externo pode ser o ID numérico ou o NOME de usuário do cliente
        // Vamos procurar na tabela `users` do seu Xtream UI
        $stmt_user = $pdo->prepare("SELECT id, exp_date, member_id FROM users WHERE (username = ? OR id = ?) LIMIT 1");
        $stmt_user->execute([$identificador_cliente, $identificador_cliente]);
        $cliente = $stmt_user->fetch(PDO::FETCH_ASSOC);

        // Verifica se o cliente existe E se ele pertence a quem configurou o webhook
        if ($cliente && $cliente['member_id'] == $revendedor_id) {
            
            // 1. DEDUÇÃO DE CRÉDITO (Se for revendedor)
            // Se o ID for 11 (Admin Master) ou nível admin, não desconta crédito
            $is_admin = false;
            $stmt_adm = $pdo->prepare("SELECT member_group_id FROM reg_users WHERE id = ?");
            $stmt_adm->execute([$revendedor_id]);
            $grupo = $stmt_adm->fetchColumn();
            
            if ($revendedor_id == 11 || $grupo == 1) {
                $is_admin = true;
            }

            $pode_renovar = true;

            if (!$is_admin) {
                // Checa se o revendedor tem crédito
                $creditos = $pdo->query("SELECT credits FROM reg_users WHERE id = $revendedor_id")->fetchColumn();
                if ($creditos >= 1) {
                    $pdo->prepare("UPDATE reg_users SET credits = credits - 1 WHERE id = ?")->execute([$revendedor_id]);
                } else {
                    $pode_renovar = false; // Não tem saldo
                }
            }

            // 2. ADICIONA +30 DIAS NA VALIDADE (Unix Timestamp)
            if ($pode_renovar) {
                $expiracao_atual = $cliente['exp_date'];
                
                // Se a conta já venceu, os 30 dias contam a partir de HOJE. 
                // Se ainda está ativa, os 30 dias SOMAM ao que ele já tem.
                $base_calculo = ($expiracao_atual > time()) ? $expiracao_atual : time();
                
                $nova_expiracao = $base_calculo + (30 * 86400); // 30 dias em segundos

                $stmt_update = $pdo->prepare("UPDATE users SET exp_date = ?, enabled = 1 WHERE id = ?");
                $stmt_update->execute([$nova_expiracao, $cliente['id']]);
            }
        }
    } catch (Exception $e) {
        // Falha no banco, apenas encerra
    }
}

// Responde ao Mercado Pago / Asaas que a notificação foi recebida com sucesso
http_response_code(200);
echo json_encode(['status' => 'ok']);
?>
