<?php
// Suprimir warnings de GuzzleHttp en PHP 8.4+
error_reporting(E_ALL & ~E_DEPRECATED);
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('default_charset', 'UTF-8');
date_default_timezone_set('America/Argentina/Buenos_Aires');
header('HTTP/1.1 200 OK');

function saveLog($text, $dump=0, $obj='') {
    $xpldName = explode('.', basename( __FILE__ ));
    $secretName = explode('_', $xpldName[0]);
    $f = fopen("logs/".$secretName[0]."_".date('m-Y')."__".md5($secretName[1]).".txt","a+");
    $t = date('d/m/Y H:i').": ".$text.($dump==1 ? " - Dump: ".strtr(print_r($_REQUEST, true), array('  ' => ' ')) : "")."\r\n";
    if ($dump==2 && $obj!='') {
        $t = date('d/m/Y H:i').": ".$text." - Dump: ".strtr(print_r($_REQUEST, true).print_r($obj, true), array('  ' => ' '))."\r\n";
    }
    fwrite($f, $t, strlen($t));
    fclose($f);
}

// 🚨 NOTIFICACIÓN DE FRAUDE MERCADOPAGO
function notificarFraudeMercadoPago($mensaje) {
    // 📧 Emails de administradores a notificar
    $admin_emails = [
        'juanvicttori@gmail.com',
        'maycoballatore@gmail.com'
    ];
    
    $subject = "🚨 ALERTA DE FRAUDE - MercadoPago IPN";
    
    // Extraer datos del mensaje para el HTML
    preg_match('/Payment ID: (.+)/', $mensaje, $matches);
    $payment_id = isset($matches[1]) ? $matches[1] : 'N/A';
    
    preg_match('/Personaje: (.+)/', $mensaje, $matches);
    $personaje = isset($matches[1]) ? $matches[1] : 'N/A';
    
    preg_match('/Cantidad solicitada: (.+)/', $mensaje, $matches);
    $cantidad = isset($matches[1]) ? $matches[1] : 'N/A';
    
    preg_match('/Precio pagado: (.+)/', $mensaje, $matches);
    $precio_pagado = isset($matches[1]) ? $matches[1] : 'N/A';
    
    preg_match('/Precio esperado: (.+)/', $mensaje, $matches);
    $precio_esperado = isset($matches[1]) ? $matches[1] : 'N/A';
    
    preg_match('/Diferencia: (.+)/', $mensaje, $matches);
    $diferencia = isset($matches[1]) ? $matches[1] : 'N/A';
    
    // Construir email HTML
    $email_body = '
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <style>
            body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
            .container { max-width: 600px; margin: 0 auto; padding: 20px; }
            .header { background: #dc3545; color: white; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; }
            .content { background: #f8f9fa; padding: 20px; border: 1px solid #dee2e6; }
            .details { background: white; padding: 15px; border-radius: 5px; margin: 15px 0; }
            .detail-row { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #eee; }
            .detail-label { font-weight: bold; color: #495057; }
            .detail-value { color: #dc3545; font-weight: bold; }
            .footer { background: #6c757d; color: white; padding: 15px; text-align: center; border-radius: 0 0 8px 8px; font-size: 12px; }
            .fraud-icon { font-size: 48px; color: #dc3545; }
            .alert { background: #f8d7da; padding: 15px; border-left: 4px solid #dc3545; margin: 10px 0; color: #721c24; }
            .danger { background: #f5c6cb; padding: 10px; border-radius: 4px; margin: 10px 0; }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="header">
                <div class="fraud-icon">🚨</div>
                <h2>FRAUDE DETECTADO - MERCADOPAGO</h2>
                <p>Sistema Anti-Fraude MercadoPago IPN</p>
            </div>
            
            <div class="content">
                <div class="alert">
                    <strong>⚠️ SE HA DETECTADO UN POSIBLE INTENTO DE FRAUDE</strong><br>
                    El sistema ha bloqueado automáticamente esta transacción por discrepancias en el precio.
                </div>
                
                <div class="details">
                    <h3 style="color: #dc3545; margin-top: 0;">🔍 DETALLES DEL INTENTO DE FRAUDE</h3>
                    
                    <div class="detail-row">
                        <span class="detail-label">🆔 Payment ID:</span>
                        <span class="detail-value">' . $payment_id . '</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">🎮 Personaje:</span>
                        <span class="detail-value">' . $personaje . '</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">🪙 Cantidad solicitada:</span>
                        <span class="detail-value">' . $cantidad . '</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">💰 Precio pagado:</span>
                        <span class="detail-value">' . $precio_pagado . '</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">✅ Precio esperado:</span>
                        <span class="detail-value">' . $precio_esperado . '</span>
                    </div>
                    
                    <div class="detail-row" style="border-bottom: 2px solid #dc3545; font-size: 18px;">
                        <span class="detail-label">⚠️ Diferencia:</span>
                        <span class="detail-value" style="font-size: 20px;">' . $diferencia . '</span>
                    </div>
                </div>
                
                <div class="danger">
                    <strong>🛡️ ACCIÓN TOMADA:</strong><br>
                    • Transacción <strong>BLOQUEADA</strong> automáticamente<br>
                    • No se entregaron coins al personaje<br>
                    • Evento registrado en logs de seguridad
                </div>
                
                <div class="details">
                    <h3 style="color: #6c757d; margin-top: 0;">🌐 INFORMACIÓN DEL ATACANTE</h3>
                    
                    <div class="detail-row">
                        <span class="detail-label">🌍 IP del atacante:</span>
                        <span class="detail-value">' . $_SERVER['REMOTE_ADDR'] . '</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">📅 Fecha:</span>
                        <span class="detail-value">' . date('d/m/Y H:i:s') . '</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">🖥️ Servidor:</span>
                        <span class="detail-value">' . $_SERVER['SERVER_NAME'] . '</span>
                    </div>
                </div>
            </div>
            
            <div class="footer">
                <strong>🔒 Sistema Anti-Fraude MercadoPago IPN</strong><br>
                L2Jade - Protección Automática Activada<br>
                <em>Revisa los logs para más detalles técnicos</em>
            </div>
        </div>
    </body>
    </html>';
    
    // Enviar a cada administrador
    $enviados = 0;
    foreach ($admin_emails as $email) {
        if (enviarEmailSMTP($email, $subject, $email_body, true)) { // true = HTML
            $enviados++;
            saveLog("Notificación de fraude MercadoPago enviada a: $email", 0);
            logToServer("Email de fraude MercadoPago enviado exitosamente a: $email", 'EMAIL');
        } else {
            saveLog("ERROR: No se pudo enviar notificación MercadoPago a: $email", 0);
            logToServer("ERROR: Falló envío de email de fraude MercadoPago a: $email", 'EMAIL');
        }
    }
    
    if ($enviados > 0) {
        saveLog("Notificaciones de fraude MercadoPago enviadas: $enviados/" . count($admin_emails), 0);
        logToServer("Notificaciones de fraude MercadoPago completadas: $enviados/" . count($admin_emails) . " emails enviados", 'EMAIL');
    } else {
        saveLog("ERROR CRÍTICO: No se pudo enviar ninguna notificación de fraude MercadoPago", 0);
        logToServer("ERROR CRÍTICO: Todos los emails de fraude MercadoPago fallaron", 'EMAIL');
    }
}

// ✅ NOTIFICACIÓN DE TRANSACCIÓN EXITOSA MERCADOPAGO
function notificarTransaccionExitosaMercadoPago($payment_id, $personaje, $cantidad_original, $cantidad_final, $precio, $payer_email = 'N/A') {
    // 📧 Emails de administradores a notificar
    $admin_emails = [
        'juanvicttori@gmail.com',
        'maycoballatore@gmail.com'
    ];
    
    $subject = "✅ TRANSACCIÓN EXITOSA - MercadoPago IPN";
    
    $bonus_coins = $cantidad_final - $cantidad_original;
    $porcentaje_bonus = ($bonus_coins / $cantidad_original) * 100;
    
    // Construir email HTML
    $email_body = '
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <style>
            body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
            .container { max-width: 600px; margin: 0 auto; padding: 20px; }
            .header { background: #007bff; color: white; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; }
            .content { background: #f8f9fa; padding: 20px; border: 1px solid #dee2e6; }
            .details { background: white; padding: 15px; border-radius: 5px; margin: 15px 0; }
            .detail-row { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #eee; }
            .detail-label { font-weight: bold; color: #495057; }
            .detail-value { color: #007bff; font-weight: bold; }
            .footer { background: #6c757d; color: white; padding: 15px; text-align: center; border-radius: 0 0 8px 8px; font-size: 12px; }
            .success-icon { font-size: 48px; color: #007bff; }
            .highlight { background: #cce5ff; padding: 10px; border-left: 4px solid #007bff; margin: 10px 0; }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="header">
                <div class="success-icon">✅</div>
                <h2>TRANSACCIÓN EXITOSA</h2>
                <p>Sistema MercadoPago IPN - L2Jade</p>
            </div>
            
            <div class="content">
                <div class="highlight">
                    <strong>Se ha procesado exitosamente una transacción MercadoPago</strong>
                </div>
                
                <div class="details">
                    <h3 style="color: #007bff; margin-top: 0;">📋 DETALLES DE LA TRANSACCIÓN</h3>
                    
                    <div class="detail-row">
                        <span class="detail-label">🆔 Payment ID:</span>
                        <span class="detail-value">' . $payment_id . '</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">🎮 Personaje:</span>
                        <span class="detail-value">' . $personaje . '</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">📧 Email del pagador:</span>
                        <span class="detail-value">' . $payer_email . '</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">💰 Monto pagado:</span>
                        <span class="detail-value">$' . $precio . ' ARS</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">🪙 Coins comprados:</span>
                        <span class="detail-value">' . $cantidad_original . ' coins</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">🎁 Bonus aplicado:</span>
                        <span class="detail-value">' . $bonus_coins . ' coins (' . number_format($porcentaje_bonus, 0) . '%)</span>
                    </div>
                    
                    <div class="detail-row" style="border-bottom: 2px solid #007bff; font-size: 18px;">
                        <span class="detail-label">✨ Total entregado:</span>
                        <span class="detail-value" style="font-size: 20px;">' . $cantidad_final . ' coins</span>
                    </div>
                </div>
                
                <div class="details">
                    <h3 style="color: #6c757d; margin-top: 0;">🌐 INFORMACIÓN TÉCNICA</h3>
                    
                    <div class="detail-row">
                        <span class="detail-label">🌍 IP del comprador:</span>
                        <span class="detail-value">' . $_SERVER['REMOTE_ADDR'] . '</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">📅 Fecha:</span>
                        <span class="detail-value">' . date('d/m/Y H:i:s') . '</span>
                    </div>
                    
                    <div class="detail-row">
                        <span class="detail-label">🖥️ Servidor:</span>
                        <span class="detail-value">' . $_SERVER['SERVER_NAME'] . '</span>
                    </div>
                </div>
            </div>
            
            <div class="footer">
                <strong>Sistema Anti-Fraude MercadoPago IPN</strong><br>
                L2Jade - Notificación Automática
            </div>
        </div>
    </body>
    </html>';
    
    // Enviar a cada administrador
    $enviados = 0;
    foreach ($admin_emails as $email) {
        if (enviarEmailSMTP($email, $subject, $email_body, true)) { // true = HTML
            $enviados++;
            saveLog("Notificación de transacción exitosa MercadoPago enviada a: $email", 0);
            logToServer("Email de transacción exitosa MercadoPago enviado a: $email - ID: $payment_id", 'EMAIL');
        } else {
            saveLog("ERROR: No se pudo enviar notificación exitosa MercadoPago a: $email", 0);
            logToServer("ERROR: Falló envío de email exitoso MercadoPago a: $email - ID: $payment_id", 'EMAIL');
        }
    }
    
    if ($enviados > 0) {
        saveLog("Notificaciones de transacción exitosa MercadoPago enviadas: $enviados/" . count($admin_emails), 0);
        logToServer("Notificaciones exitosas MercadoPago completadas: $enviados/" . count($admin_emails) . " emails enviados - ID: $payment_id", 'EMAIL');
    } else {
        saveLog("ERROR: No se pudo enviar ninguna notificación de transacción exitosa MercadoPago", 0);
        logToServer("ERROR CRÍTICO: Todos los emails exitosos MercadoPago fallaron - ID: $payment_id", 'EMAIL');
    }
}

// 📧 CONFIGURACIÓN SMTP - Reutilizar la misma configuración
function getSmtpConfig() {
    return [
        'host' => 'mail.l2jade.com.ar',
        'port' => 465,
        'username' => 'soporte@l2jade.com.ar',
        'password' => 'Za6s;-9^#A*e',
        'encryption' => 'ssl',
        'from_email' => 'soporte@l2jade.com.ar',
        'from_name' => 'Sistema Anti-Fraude MercadoPago'
    ];
}

// 🔧 CONFIGURACIÓN DE LOGGING AL SERVIDOR WEB
function getServerLogConfig() {
    return [
        'enabled' => true,
        'prefix' => '[MERCADOPAGO-IPN]',
        'log_successful' => true,
        'log_fraud' => true,
        'log_errors' => true,
        'log_email_status' => true
    ];
}

// 📝 FUNCIÓN PARA LOG AL SERVIDOR WEB
function logToServer($message, $type = 'INFO') {
    $config = getServerLogConfig();
    
    if (!$config['enabled']) {
        return;
    }
    
    // Filtrar según tipo de log
    switch ($type) {
        case 'SUCCESS':
            if (!$config['log_successful']) return;
            break;
        case 'FRAUD':
            if (!$config['log_fraud']) return;
            break;
        case 'ERROR':
            if (!$config['log_errors']) return;
            break;
        case 'EMAIL':
            if (!$config['log_email_status']) return;
            break;
    }
    
    $timestamp = date('Y-m-d H:i:s');
    $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
    $script = basename(__FILE__);
    
    $logMessage = "{$config['prefix']} [$timestamp] [$type] [$ip] [$script] $message";
    
    // Escribir al log del servidor web
    error_log($logMessage);
    
    // También escribir a archivo local
    $localLogFile = "logs/mercadopago_debug_" . date('Y-m') . ".log";
    $localLogMessage = "[$timestamp] [$type] $message\n";
    
    if (!file_exists('logs')) {
        mkdir('logs', 0755, true);
    }
    
    file_put_contents($localLogFile, $localLogMessage, FILE_APPEND | LOCK_EX);
}

// 🚨 SMTP NATIVO - Misma función que PayPal
function enviarEmailSMTP($to, $subject, $body, $isHtml = false) {
    $config = getSmtpConfig();
    
    logToServer("Iniciando envío SMTP MercadoPago a: $to, Subject: $subject", 'EMAIL');
    
    $socket_url = $config['host'];
    if ($config['encryption'] === 'ssl') {
        $socket_url = 'ssl://' . $config['host'];
    }
    
    $socket = fsockopen($socket_url, $config['port'], $errno, $errstr, 10);
    if (!$socket) {
        saveLog("ERROR SMTP MercadoPago: No se pudo conectar - $errno: $errstr", 0);
        logToServer("ERROR SMTP MercadoPago: Conexión fallida - Host: {$socket_url}:{$config['port']}, Error: $errno: $errstr", 'EMAIL');
        return false;
    }
    
    stream_set_timeout($socket, 10);
    logToServer("Conexión SMTP MercadoPago establecida - Host: {$socket_url}:{$config['port']}", 'EMAIL');
    
    $read = function() use ($socket) {
        $response = '';
        do {
            $line = fgets($socket, 515);
            $response .= $line;
        } while (isset($line[3]) && $line[3] === '-');
        $clean_response = trim($response);
        logToServer("SMTP <- $clean_response", 'EMAIL');
        return $clean_response;
    };
    
    $send = function($command) use ($socket) {
        logToServer("SMTP -> $command", 'EMAIL');
        fputs($socket, $command . "\r\n");
    };
    
    try {
        $response = $read();
        if (strpos($response, '220') !== 0) {
            throw new Exception("Error en saludo SMTP: $response");
        }
        
        $send("EHLO " . $config['host']);
        $response = $read();
        if (strpos($response, '250') !== 0) {
            throw new Exception("Error en EHLO: $response");
        }
        
        if ($config['encryption'] === 'tls') {
            logToServer("Iniciando STARTTLS", 'EMAIL');
            $send("STARTTLS");
            $response = $read();
            if (strpos($response, '220') !== 0) {
                throw new Exception("Error en STARTTLS: $response");
            }
            
            if (!stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {
                throw new Exception("Error al habilitar TLS");
            }
            
            logToServer("TLS habilitado exitosamente", 'EMAIL');
            $send("EHLO " . $config['host']);
            $response = $read();
        }
        
        logToServer("Iniciando autenticación SMTP MercadoPago - Usuario: {$config['username']}", 'EMAIL');
        $send("AUTH LOGIN");
        $response = $read();
        if (strpos($response, '334') !== 0) {
            throw new Exception("Error iniciando AUTH LOGIN: $response");
        }
        
        $send(base64_encode($config['username']));
        $response = $read();
        if (strpos($response, '334') !== 0) {
            throw new Exception("Error con usuario: $response");
        }
        
        $send(base64_encode($config['password']));
        $response = $read();
        if (strpos($response, '235') !== 0) {
            throw new Exception("Error de autenticación - credenciales incorrectas: $response");
        }
        
        logToServer("Autenticación SMTP MercadoPago exitosa", 'EMAIL');
        
        $send("MAIL FROM: <" . $config['from_email'] . ">");
        $response = $read();
        if (strpos($response, '250') !== 0) {
            throw new Exception("Error en MAIL FROM: $response");
        }
        
        $recipients = is_array($to) ? $to : [$to];
        foreach ($recipients as $recipient) {
            $send("RCPT TO: <$recipient>");
            $response = $read();
            if (strpos($response, '250') !== 0) {
                throw new Exception("Error en RCPT TO: $response");
            }
        }
        
        logToServer("Destinatarios MercadoPago configurados: " . implode(', ', $recipients), 'EMAIL');
        
        $send("DATA");
        $response = $read();
        if (strpos($response, '354') !== 0) {
            throw new Exception("Error en DATA: $response");
        }
        
        $headers = "From: " . $config['from_name'] . " <" . $config['from_email'] . ">\r\n";
        $headers .= "Reply-To: " . $config['from_email'] . "\r\n";
        $headers .= "Content-Type: " . ($isHtml ? "text/html" : "text/plain") . "; charset=UTF-8\r\n";
        $headers .= "X-Priority: 1\r\n";
        $headers .= "Date: " . date('r') . "\r\n";
        
        $emailContent = "To: " . implode(', ', $recipients) . "\r\n";
        $emailContent .= "Subject: $subject\r\n";
        $emailContent .= $headers . "\r\n";
        $emailContent .= $body . "\r\n.\r\n";
        
        $send($emailContent);
        $response = $read();
        if (strpos($response, '250') !== 0) {
            throw new Exception("Error enviando email: $response");
        }
        
        logToServer("Contenido del email MercadoPago enviado", 'EMAIL');
        
        $send("QUIT");
        fclose($socket);
        
        logToServer("Email MercadoPago enviado exitosamente a: $to", 'EMAIL');
        return true;
        
    } catch (Exception $e) {
        saveLog("ERROR SMTP MercadoPago: " . $e->getMessage(), 0);
        logToServer("ERROR SMTP MercadoPago: " . $e->getMessage() . " - Destinatario: $to", 'EMAIL');
        fclose($socket);
        return false;
    }
}

// INICIO DEL SCRIPT PRINCIPAL
list($year, $month, $day, $hour, $minute, $second, $timezone) = explode(":", date("Y:m:d:H:i:s:T"));
$date = $year . "-" . $month . "-" . $day;
$timestamp = $date . " " . $hour . ":" . $minute . ":" . $second . " " . $timezone;

$indexing = 1;
include '../configs.php';
include '../functions/func.php';

require ('../mp_api/mercado_pago_api/autoload.php');

use MercadoPago\MercadoPagoConfig;
use MercadoPago\Client\Payment\PaymentClient;

MercadoPagoConfig::setAccessToken($mp_access_token);

// Log inicial al servidor web
logToServer("IPN MercadoPago iniciado - REQUEST recibido", 'INFO');
logToServer("Datos REQUEST recibidos: " . json_encode($_REQUEST), 'INFO');

// 🚨 VALIDACIÓN ANTI-FRAUDE MERCADOPAGO OPTIMIZADA
function detectarFraudeMercadoPago() {
    // 1. User-Agent sospechoso
    if (isset($_SERVER['HTTP_USER_AGENT'])) {
        $ua = strtolower($_SERVER['HTTP_USER_AGENT']);
        $patterns = ['curl', 'postman', 'mmoweb', 'panel', 'test', 'sandbox'];
        foreach ($patterns as $p) {
            if (strpos($ua, $p) !== false) return "User-Agent: $p";
        }
    }
    
    // 2. Headers/REQUEST con MMOWeb o testing
    $all_data = strtolower(json_encode(array_merge($_REQUEST, getallheaders())));
    if (strpos($all_data, 'mmoweb') !== false) return "MMOWeb detectado";
    if (strpos($all_data, 'test') !== false) return "Testing detectado";
    if (strpos($all_data, 'sandbox') !== false) return "Sandbox detectado";
    
    // 3. Verificar si es entorno de testing de MercadoPago
    if (isset($_REQUEST['test']) && $_REQUEST['test'] == 'true') {
        return "MercadoPago test mode";
    }
    
    return false;
}

$fraud = detectarFraudeMercadoPago();
if ($fraud) {
    $msg = "FRAUDE MERCADOPAGO: $fraud\nIP: " . $_SERVER['REMOTE_ADDR'] . "\nID: " . ($_REQUEST['data_id'] ?? $_REQUEST['id'] ?? 'N/A');
    saveLog("🚨 FRAUDE MERCADOPAGO: $fraud", 1);
    notificarFraudeMercadoPago($msg);
    logToServer("🚨 FRAUDE MERCADOPAGO: $fraud", 'FRAUD');
    exit;
}

$topic = $_REQUEST["type"];
$data_id = isset($_REQUEST["data_id"]) ? $_REQUEST["data_id"] : $_REQUEST["id"];

logToServer("Topic: $topic, Data ID: $data_id", 'INFO');

$tid = '';
$payment = null;
$status = '';
$nombre_personaje = '';
$price = 0;
$cantidad = 0;
$payer_email = 'N/A';

if($topic=='payment'){
    try {
        $client = new PaymentClient();
        $payment = $client->get($data_id);
        $tid = $payment->id;
        $status = vCode($payment->status);
        $nombre_personaje = vCode($payment->external_reference);
        $price = floatval($payment->transaction_amount);
        $cantidad = intval($payment->additional_info->items[0]->quantity);
        
        // Intentar obtener email del pagador
        if (isset($payment->payer->email)) {
            $payer_email = vCode($payment->payer->email);
        }
        
        if ($cantidad == 0) {
            // En v3, necesitamos usar el cliente de MerchantOrder
            use MercadoPago\Client\MerchantOrder\MerchantOrderClient;
            $merchant_order_client = new MerchantOrderClient();
            $item = $merchant_order_client->get($payment->order->id);
            $cantidad = intval($item->items[0]->quantity);
        }
        
        logToServer("Datos del payment obtenidos - ID: $tid, Status: $status, Personaje: $nombre_personaje, Precio: $$price ARS, Cantidad: $cantidad, Email: $payer_email", 'INFO');
        
        // 🔐 VALIDACIÓN OFICIAL MERCADOPAGO - Verificar que el webhook sea legítimo
        if (!validarWebhookMercadoPago($payment)) {
            $fraud_message = "FAKE WEBHOOK MERCADOPAGO DETECTADO!\n";
            $fraud_message .= "Payment ID: $tid\n";
            $fraud_message .= "Personaje: $nombre_personaje\n";
            $fraud_message .= "Precio fake: $$price ARS\n";
            $fraud_message .= "IP atacante: " . $_SERVER['REMOTE_ADDR'] . "\n";
            $fraud_message .= "ESTE WEBHOOK NO PROVIENE DE MERCADOPAGO!";
            
            saveLog("🚨 FAKE WEBHOOK MERCADOPAGO RECHAZADO!", 1);
            notificarFraudeMercadoPago($fraud_message);
            logToServer("🚨 FAKE WEBHOOK MERCADOPAGO BLOQUEADO - ID: $tid", 'FRAUD');
            exit;
        }
        
    } catch (Exception $e) {
        saveLog("Error obteniendo datos del payment: " . $e->getMessage(), 1);
        logToServer("ERROR: Falló obtención de datos del payment - ID: $data_id, Error: " . $e->getMessage(), 'ERROR');
        exit;
    }
}

// 🔐 FUNCIÓN PARA VALIDAR WEBHOOK MERCADOPAGO (MÉTODO OFICIAL)
function validarWebhookMercadoPago($payment) {
    global $mp_access_token;
    
    if (!$payment || !isset($payment->id)) {
        logToServer("ERROR: Payment object inválido para validación", 'ERROR');
        return false;
    }
    
    // 1. Verificar que el payment tenga datos coherentes
    if (empty($payment->status) || empty($payment->transaction_amount)) {
        logToServer("ERROR: Payment con datos incompletos - posible fake", 'FRAUD');
        return false;
    }
    
    // 2. Verificar que el payment ID sea numérico (MercadoPago usa IDs numéricos)
    if (!is_numeric($payment->id)) {
        logToServer("ERROR: Payment ID no numérico - posible fake: " . $payment->id, 'FRAUD');
        return false;
    }
    
    // 3. VALIDACIÓN OFICIAL: Verificar headers HTTP de MercadoPago
    $headers = getallheaders();
    $headers_lower = array_change_key_case($headers, CASE_LOWER);
    
    // Verificar User-Agent de MercadoPago
    if (isset($headers_lower['user-agent'])) {
        $user_agent = strtolower($headers_lower['user-agent']);
        if (strpos($user_agent, 'mercadopago') === false && 
            strpos($user_agent, 'mp-') === false) {
            logToServer("WARNING: User-Agent no es de MercadoPago: " . $headers_lower['user-agent'], 'WARNING');
        }
    }
    
    // 4. VALIDACIÓN CRUZADA: Re-consultar el payment a MercadoPago para verificar autenticidad
    try {
        logToServer("Verificando autenticidad del payment con MercadoPago API", 'INFO');
        $client = new PaymentClient();
        $payment_verificacion = $client->get($payment->id);
        
        if (!$payment_verificacion || $payment_verificacion->id != $payment->id) {
            logToServer("ERROR: Payment no existe en MercadoPago - posible fake: " . $payment->id, 'FRAUD');
            return false;
        }
        
        // Verificar que los datos coincidan
        if ($payment_verificacion->status != $payment->status ||
            $payment_verificacion->transaction_amount != $payment->transaction_amount) {
            logToServer("ERROR: Datos del payment no coinciden - posible manipulación", 'FRAUD');
            return false;
        }
        
        logToServer("✅ Payment verificado exitosamente con MercadoPago API", 'INFO');
        
    } catch (Exception $e) {
        logToServer("ERROR: Falló verificación con MercadoPago API: " . $e->getMessage(), 'ERROR');
        return false;
    }
    
    // 5. Verificar que el access token sea válido (indirectamente ya verificado en el paso 4)
    if (empty($mp_access_token)) {
        logToServer("ERROR: Access token de MercadoPago no configurado", 'ERROR');
        return false;
    }
    
    // Log de la IP para monitoreo
    $client_ip = $_SERVER['REMOTE_ADDR'];
    logToServer("Webhook MercadoPago autenticado desde IP: $client_ip", 'INFO');
    
    logToServer("✅ Webhook MercadoPago validado como LEGÍTIMO por método oficial", 'INFO');
    return true;
}

if ($tid == '') {
    saveLog("Payment ID no válido!", 1);
    logToServer("ERROR: Payment ID vacío o inválido", 'ERROR');
    exit;
}

if ($_REQUEST["topic"] == $_REQUEST["type"]) {
    saveLog("Payment repetidos", 1);
    logToServer("WARNING: Topic y type son iguales - posible duplicado", 'INFO');
}

// Validaciones básicas
if ($nombre_personaje == '') {
    saveLog("Nombre de personaje no especificado! ($nombre_personaje)", 1);
    logToServer("ERROR: Nombre de personaje vacío", 'ERROR');
    exit;
}

if (intval($cantidad) == 0) {
    saveLog("Error en la cantidad de coins! ($cantidad)", 1);
    logToServer("ERROR: Cantidad de coins inválida: $cantidad", 'ERROR');
    exit;
}

logToServer("Validaciones básicas: Personaje y cantidad OK", 'INFO');

// Validación anti-fraude MercadoPago usando precio dinámico
// Obtener precio actual desde la sesión de valores (si está disponible)
// Como fallback, usar precio desde configs o calcular dinámicamente
$precio_por_coin_ars = 100; // Precio base por coin en ARS (actualizar según inflación)
$precio_esperado_ars = $cantidad * $precio_por_coin_ars;

// Tolerancia del 5% para MercadoPago (por variaciones de cambio)
$tolerancia_porcentaje = 0.05;
$tolerancia_ars = $precio_esperado_ars * $tolerancia_porcentaje;

if (abs($price - $precio_esperado_ars) > $tolerancia_ars) {
    $error_message = "INTENTO DE FRAUDE DETECTADO EN MERCADOPAGO!\n";
    $error_message .= "Payment ID: $tid\n";
    $error_message .= "Personaje: $nombre_personaje\n";
    $error_message .= "Email pagador: $payer_email\n";
    $error_message .= "Cantidad solicitada: $cantidad coins\n";
    $error_message .= "Precio pagado: $$price ARS\n";
    $error_message .= "Precio esperado: $$precio_esperado_ars ARS\n";
    $error_message .= "Diferencia: $" . abs($price - $precio_esperado_ars) . " ARS\n";
    $error_message .= "Fecha: " . date('d/m/Y H:i:s') . "\n";
    
    saveLog("FRAUDE MERCADOPAGO: Precio incorrecto! Pagado: $$price ARS, Esperado: $$precio_esperado_ars ARS, Diferencia: $" . abs($price - $precio_esperado_ars) . " ARS", 1);
    
    // Log al servidor web
    logToServer("FRAUDE DETECTADO MERCADOPAGO - ID: $tid, Personaje: $nombre_personaje, Pagado: $$price ARS, Esperado: $$precio_esperado_ars ARS, Email: $payer_email", 'FRAUD');
    
    // Notificar al administrador por email
    notificarFraudeMercadoPago($error_message);
    
    exit;
}

saveLog("Validación de precio MercadoPago OK: $cantidad coins por $$price ARS", 0);
logToServer("Validación de precio MercadoPago OK - ID: $tid, Personaje: $nombre_personaje, Cantidad: $cantidad coins, Precio: $$price ARS", 'INFO');

try {
    $pdo->beginTransaction();
    logToServer("Transacción de BD MercadoPago iniciada", 'INFO');

    // 🛡️ VERIFICAR PAGOS DUPLICADOS CON PREPARED STATEMENTS
    $stmt = $pdo->prepare("SELECT * FROM items_pagos WHERE pay_id = ?");
    $stmt->execute([$tid]);
    if ($stmt->rowCount() > 0){
        saveLog("Pago MercadoPago ya almacenado #$tid", 1);
        logToServer("ERROR: Pago duplicado MercadoPago detectado - ID: $tid", 'ERROR');
        $pdo->rollBack();
        exit;
    }
    logToServer("Verificación de pago duplicado MercadoPago: OK - ID no existe previamente", 'INFO');

    if ($payment && $payment->status == 'approved'){
        logToServer("Procesando pago MercadoPago aprobado - ID: $tid", 'INFO');
        
        // 🛡️ OBTENER ID DEL PERSONAJE CON PREPARED STATEMENTS
        $stmt = $pdo->prepare("SELECT obj_id, char_name FROM characters WHERE char_name = ?");
        $stmt->execute([$nombre_personaje]);
        $pers_row = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if (!$pers_row) {
            saveLog("Error al obtener el id del personaje MercadoPago # $nombre_personaje", 1);
            logToServer("ERROR: Personaje no encontrado en BD MercadoPago: $nombre_personaje", 'ERROR');
            $pdo->rollBack();
            exit;
        }
        
        $pers_id = $pers_row['obj_id'];
        logToServer("Personaje encontrado en BD MercadoPago - ID: $pers_id, Nombre: $nombre_personaje", 'INFO');

        // 💰 CÁLCULO DE BONUS (MANTENIENDO LÓGICA ORIGINAL)
        $num_bonus = 0;
        $num = $cantidad;
        
        if ($num <= 99) {
            $num_bonus = ($num) * 100 / 1000;       // 10%
            $bonus_percent = '10%';
        } elseif ($num >= 100 && $num <= 499) {
            $num_bonus = ($num) * 150 / 1000;       // 15%
            $bonus_percent = '15%';
        } elseif ($num >= 500 && $num <= 999) {
            $num_bonus = ($num) * 200 / 1000;       // 20%
            $bonus_percent = '20%';
        } elseif ($num >= 1000 && $num <= 2999) {
            $num_bonus = ($num) * 250 / 1000;       // 25%
            $bonus_percent = '25%';
        } elseif ($num >= 3000 && $num <= 7499) {
            $num_bonus = ($num) * 300 / 1000;       // 30%
            $bonus_percent = '30%';
        } elseif ($num >= 7500 && $num <= 9999999) {
            $num_bonus = ($num) * 350 / 1000;       // 35%
            $bonus_percent = '35%';
        }

        $bonus_coins = intval($num_bonus);
        $cantidad_original = $cantidad;
        $cantidad += $bonus_coins;
        
        logToServer("Cálculo de bonus MercadoPago - Cantidad original: $cantidad_original, Bonus: $bonus_coins ($bonus_percent), Total final: $cantidad", 'INFO');

        // 🛡️ INSERTAR COMPROBANTE CON PREPARED STATEMENTS
        $stmt = $pdo->prepare("INSERT INTO items_pagos (pay_id, estado_pago, metodo_pago, personaje, precio, cantidad, is_claimed) VALUES (?, 'approved', 'mercadopago', ?, ?, ?, 0)");
        $result = $stmt->execute([$tid, $nombre_personaje, $price, $cantidad]);
        
        if ($result) {
            logToServer("Registro MercadoPago insertado en BD - ID: $tid, Personaje: $nombre_personaje, Precio: $$price ARS, Cantidad final: $cantidad", 'INFO');
        } else {
            logToServer("ERROR: Falló inserción en BD MercadoPago - ID: $tid", 'ERROR');
            throw new Exception("Error al insertar en BD MercadoPago");
        }

        // Verificar y actualizar items
        $stmt = $pdo->prepare("SELECT owner_id, count, item_id, loc FROM items WHERE owner_id = ? AND item_id = '9623'");
        $stmt->execute([$pers_id]);
        $items = $stmt->fetchAll(PDO::FETCH_ASSOC);

        if (count($items) > 1) {
            saveLog("Se detectaron items repetidos para el personaje $nombre_personaje", 1);
        }
        

        
        $pdo->commit();
        logToServer("Transacción de BD MercadoPago confirmada exitosamente", 'INFO');
        saveLog("Pago MercadoPago aprobado #$tid. Cantidad: $cantidad a personaje $nombre_personaje", 1);

        // 📧 NOTIFICAR TRANSACCIÓN EXITOSA
        notificarTransaccionExitosaMercadoPago($tid, $nombre_personaje, $cantidad_original, $cantidad, $price, $payer_email);

        // Log al servidor web
        logToServer("TRANSACCIÓN EXITOSA MERCADOPAGO - ID: $tid, Personaje: $nombre_personaje, Pagado: $$price ARS, Coins: $cantidad_original, Bonus: $bonus_coins, Total: $cantidad, Email: $payer_email", 'SUCCESS');

    } elseif ($payment && $payment->status == 'in_process') {
        saveLog("Pago MercadoPago en proceso", 1);
        logToServer("Pago MercadoPago en proceso - ID: $tid, Status: in_process", 'INFO');
        $pdo->rollBack();
    } elseif ($payment && $payment->status == 'rejected') {
        saveLog("Pago MercadoPago rechazado", 1);
        logToServer("Pago MercadoPago rechazado - ID: $tid, Status: rejected", 'INFO');
        $pdo->rollBack();
    } else {
        saveLog("Error general MercadoPago - Status desconocido", 1);
        logToServer("ERROR: Status desconocido MercadoPago - ID: $tid, Status: " . ($payment ? $payment->status : 'unknown'), 'ERROR');
        $pdo->rollBack();
    }
    
} catch (PDOException $e) {
    $pdo->rollBack();
    saveLog("Error en ejecución SQL MercadoPago: " . $e->getMessage(), 1);
    logToServer("ERROR BD MERCADOPAGO - ID: $tid, Error: " . $e->getMessage(), 'ERROR');
} catch (Exception $e) {
    $pdo->rollBack();
    saveLog("Error general MercadoPago: " . $e->getMessage(), 1);
    logToServer("ERROR GENERAL MERCADOPAGO - ID: $tid, Error: " . $e->getMessage(), 'ERROR');
}

logToServer("Script MercadoPago IPN finalizado - ID: $tid", 'INFO');
?>
