<?php
// webhook_cliente.php - Processa pagamentos dos Clientes Finais em background
require_once 'conexao.php';
date_default_timezone_set('America/Sao_Paulo');

// 1. Recebe os dados ocultos do Mercado Pago / Asaas
$input = file_get_contents('php://input');
$data = json_decode($input, true);

$payment_id = null;
$gateway = '';

if (isset($_GET['topic']) && $_GET['topic'] == 'payment') {
    $payment_id = $_GET['id'];
    $gateway = 'mp';
} elseif (isset($data['action']) && strpos($data['action'], 'payment') !== false && isset($data['data']['id'])) {
    $payment_id = $data['data']['id'];
    $gateway = 'mp';
} elseif (isset($data['event']) && in_array($data['event'], ['PAYMENT_RECEIVED', 'PAYMENT_CONFIRMED']) && isset($data['payment']['id'])) {
    $payment_id = $data['payment']['id'];
    $gateway = 'asaas';
}

// CORREÇÃO 1: Trocado 400 por 200. Avisa o Asaas que recebemos, mas ignoramos.
if (!$payment_id) { http_response_code(200); die("Ignorado: ID nao encontrado"); }

// 2. Busca o pagamento no banco (Precisamos saber de qual cliente é esse PIX)
$stmtPag = $connUser->prepare("SELECT * FROM pagamentos WHERE id_pagamento_mp = ? LIMIT 1");
$stmtPag->execute([$payment_id]);
$pagamento = $stmtPag->fetch(PDO::FETCH_ASSOC);

// CORREÇÃO 2: Trocado 404 por 200.
if (!$pagamento) { http_response_code(200); die("Ignorado: Pagamento nao registrado no banco."); }
if ($pagamento['status'] === 'approved') { http_response_code(200); die("Pagamento ja processado anteriormente."); }

$usuario_cliente = $pagamento['usuario_id'];
$valor_pago = (float)$pagamento['valor'];

// 3. Descobre se é cliente oficial ou se é um teste que está virando oficial
$is_teste = false;
$cliente = null;
$stmtCli = $connUser->prepare("SELECT * FROM usuario WHERE usuario = ? LIMIT 1");
$stmtCli->execute([$usuario_cliente]);
if ($stmtCli->rowCount() > 0) {
    $cliente = $stmtCli->fetch(PDO::FETCH_ASSOC);
} else {
    $stmtTest = $connUser->prepare("SELECT * FROM teste WHERE usuario = ? LIMIT 1");
    $stmtTest->execute([$usuario_cliente]);
    if ($stmtTest->rowCount() > 0) {
        $cliente = $stmtTest->fetch(PDO::FETCH_ASSOC);
        $is_teste = true;
    }
}

// CORREÇÃO 3: Trocado 404 por 200.
if (!$cliente) { http_response_code(200); die("Ignorado: Cliente nao encontrado no banco."); }

// 4. Puxa as Chaves do Dono do Cliente (Revendedor)
$dono = $cliente['CadUser'];
$stmtConfig = $connUser->prepare("SELECT access_token, access_token_asaas FROM mp_revendedores WHERE usuario_revendedor = ? LIMIT 1");
$stmtConfig->execute([$dono]);
$configPgto = $stmtConfig->fetch(PDO::FETCH_ASSOC);

$is_approved = false;

// 5. Verifica direto na API do Gateway para evitar fraudes
if ($gateway === 'mp' && !empty($configPgto['access_token'])) {
    $ch = curl_init("https://api.mercadopago.com/v1/payments/" . $payment_id);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer " . trim($configPgto['access_token'])]);
    $res = curl_exec($ch); curl_close($ch);
    $json = json_decode($res, true);
    if (isset($json['status']) && $json['status'] === 'approved') { $is_approved = true; }
} elseif ($gateway === 'asaas' && !empty($configPgto['access_token_asaas'])) {
    $ch = curl_init("https://www.asaas.com/api/v3/payments/" . $payment_id);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ["access_token: " . trim($configPgto['access_token_asaas'])]);
    $res = curl_exec($ch); curl_close($ch);
    $json = json_decode($res, true);
    if (isset($json['status']) && in_array($json['status'], ['RECEIVED', 'CONFIRMED'])) { $is_approved = true; }
}

// =========================================================================
// A MÁGICA: APROVADO, RENOVA E AVISA NO WHATSAPP!
// =========================================================================
if ($is_approved) {
    
    // Descobre quantos dias dar baseado no valor que ele pagou
    $stmtPlano = $connUser->prepare("SELECT dias FROM planos_revenda WHERE id_revendedor = ? AND valor = ? LIMIT 1");
    $stmtPlano->execute([$dono, $valor_pago]);
    $plano = $stmtPlano->fetch(PDO::FETCH_ASSOC);
    $dias_adicionar = $plano ? (int)$plano['dias'] : 30; // Padrão 30 dias se não achar o plano exato

    $venc_raw = $cliente['data_premio'];
    $atual_ts = is_numeric($venc_raw) ? (int)$venc_raw : strtotime(str_replace('/', '-', $venc_raw));
    $base = ($atual_ts > time()) ? $atual_ts : time();
    $nova_data = date('Y-m-d H:i:s', strtotime("+{$dias_adicionar} days", $base));

    // Renova o Cliente ou Converte de Teste para Oficial
    if ($is_teste) {
        $email = $cliente['email'] ?? ''; 
        $whatsapp = $cliente['whatsapp'] ?? ''; 
        $sql_ins = "INSERT INTO usuario (CadUser, nome, usuario, senha, email, conexao, data_premio, perfil, bloqueado, data_cadastro, whatsapp) VALUES (?, ?, ?, ?, ?, 1, ?, ?, 'nao', NOW(), ?)";
        $connUser->prepare($sql_ins)->execute([$cliente['CadUser'], $cliente['nome'], $cliente['usuario'], $cliente['senha'], $email, $nova_data, $cliente['perfil'], $whatsapp]);
        $connUser->prepare("DELETE FROM teste WHERE id = ?")->execute([$cliente['id']]);
    } else {
        $connUser->prepare("UPDATE usuario SET data_premio = ?, bloqueado = 'nao' WHERE id = ?")->execute([$nova_data, $cliente['id']]);
    }

    // Marca como aprovado no banco de pagamentos
    $connUser->prepare("UPDATE pagamentos SET status = 'approved' WHERE id_pagamento_mp = ?")->execute([$payment_id]);

    // =========================================================================
    // DISPARO WHATSAPP VIA EVOLUTION API
    // =========================================================================
    $telefone = !empty($cliente['whatsapp']) ? preg_replace("/[^0-9]/", "", $cliente['whatsapp']) : '';
    if (!empty($telefone) && !empty($dono)) {
        $stmtWpp = $connGeral->prepare("SELECT * FROM config_api_whatsapp WHERE usuario = ? LIMIT 1");
        $stmtWpp->execute([trim($dono)]);
        $conf = $stmtWpp->fetch(PDO::FETCH_ASSOC);

        if ($conf && !empty($conf['api_url']) && !empty($conf['instancia'])) {
            $msg = $conf['msg_renovacao'] ?? "✅ Sucesso! O seu plano foi renovado.\n\n👤 User: {usuario}\n📅 Novo Vencimento: {vencimento}";
            
            $msg = str_replace('{nome}', $cliente['nome'], $msg);
            $msg = str_replace('{usuario}', $cliente['usuario'], $msg);
            $msg = str_replace('{senha}', $cliente['senha'], $msg);
            $msg = str_replace('{vencimento}', date('d/m/Y', strtotime($nova_data)), $msg);
            
            if (strlen($telefone) == 10 || strlen($telefone) == 11) { $telefone = "55" . $telefone; }
            
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => rtrim($conf['api_url'], '/') . "/message/sendText/" . trim($conf['instancia']),
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_CUSTOMREQUEST => 'POST',
                CURLOPT_POSTFIELDS => json_encode([
                    "number" => $telefone,
                    "options" => ["delay" => 1200, "presence" => "composing", "linkPreview" => false],
                    "textMessage" => ["text" => $msg]
                ]),
                CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'apikey: ' . trim($conf['api_key'])],
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_SSL_VERIFYHOST => false
            ));
            curl_exec($curl); curl_close($curl);
        }
    }
    
    http_response_code(200); echo "Processado com sucesso!";
} else {
    http_response_code(200); echo "Ainda pendente.";
}
?>
