<?php

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

// Ruta del archivo de logs
$logFile = __DIR__ . '/webhook_log.txt';

// Función para escribir en el log
function writeLog($message) {
    global $logFile;
    $date = date('Y-m-d H:i:s');
    file_put_contents($logFile, "[$date] $message\n", FILE_APPEND);
}
file_put_contents('coinbase_log.txt', print_r($payload, true), FILE_APPEND); // Guarda en un log


writeLog("-------- Nuevo Webhook recibido -------");
writeLog(date('Y-m-d H:i:s'));

// Clave secreta del webhook
$sharedSecret = 'f9170111-299b-442b-a384-ced5a25e7963';

// Cuerpo sin procesar de la solicitud (el payload)
$requestBody = file_get_contents('php://input');

// Firma del encabezado enviado por Coinbase
$signatureHeader = $_SERVER['HTTP_X_CC_WEBHOOK_SIGNATURE'] ?? '';

// Verifica la firma (usando HMAC SHA256)
$computedSignature = hash_hmac('sha256', $requestBody, $sharedSecret);

// Compara firmas de forma segura. Y detecta si hay fraude
if (!hash_equals($computedSignature, $signatureHeader)) {
    http_response_code(400);
    echo 'Firma no válida.';
    writeLog('Firma no válida. Posible intento de fraude.');
    exit;
}

// Decodifica el JSON del webhook
$payload = json_decode($requestBody, true);

// Procesar evento
$eventType = $payload['event']['type'] ?? '';
$chargeCode = $payload['event']['data']['code'] ?? '';
$idPago = $payload['event']['data']['metadata']['order_id'] ?? '';
$tid = $idPago; // ID de la transacción
$cantidad = $payload['event']['data']['pricing']['local']['amount'] ?? 0;
$nombre_personaje = $payload['event']['data']['name'] ?? '';
$price = '';


if ($idPago=='') {
    writeLog('ID de pago no encontrado. ');
    writeLog("Eventos: ".print_r($payload,true));
    exit;    
}
if ($nombre_personaje == '') {
    writeLog("Nombre de personaje no especificado! ($nombre_personaje)", 1);
    writeLog("ERROR: Nombre de personaje vacío", 'ERROR');
    exit;
}
if (intval($cantidad) == 0) {
    writeLog("ERROR: Cantidad de coins inválida: $cantidad", 'ERROR');
    writeLog("Eventos: ".print_r($payload,true));
    exit;
}


switch ($eventType) {
    case 'charge:created':
        // Lógica cuando se crea el pago
        writeLog("Charge created: $chargeCode");
        break;
    case 'charge:confirmed':
        $stmt = $pdo->prepare("SELECT obj_id FROM characters WHERE char_name = ?");
        $stmt->execute([$nombre_personaje]);
        $pers_row = $stmt->fetch(PDO::FETCH_ASSOC);
        if (!$pers_row) {
            writeLog("ERROR: Personaje no encontrado en BD: $nombre_personaje", 'ERROR');
            $pdo->rollBack();
            exit;
        }
        $pers_id = $pers_row['obj_id'];
        writeLog("Personaje encontrado en BD - ID: $pers_id, Nombre: $nombre_personaje", 'INFO');

        // Cálculo de bonus
        $num_bonus = 0;
        if ($cantidad <= 99) {
            $num_bonus = $cantidad * 0.10;
            $bonus_percent = '10%';
        } elseif ($cantidad <= 499) {
            $num_bonus = $cantidad * 0.15;
            $bonus_percent = '15%';
        } elseif ($cantidad <= 999) {
            $num_bonus = $cantidad * 0.20;
            $bonus_percent = '20%';
        } elseif ($cantidad <= 2999) {
            $num_bonus = $cantidad * 0.25;
            $bonus_percent = '25%';
        } elseif ($cantidad <= 7499) {
            $num_bonus = $cantidad * 0.30;
            $bonus_percent = '30%';
        } else {
            $num_bonus = $cantidad * 0.35;
            $bonus_percent = '35%';
        }
        
        $bonus_coins = intval($num_bonus);
        $cantidad_original = $cantidad;
        $cantidad += $bonus_coins;
        
        writeLog("Cálculo de bonus - Cantidad original: $cantidad_original, Bonus: $bonus_coins ($bonus_percent), Total final: $cantidad", 'INFO');

        // Insertar comprobante de pago
        $stmt = $pdo->prepare("INSERT INTO items_pagos (pay_id, estado_pago, metodo_pago, personaje, precio, cantidad, is_claimed) VALUES (?, 'approved', 'paypal', ?, ?, ?, 0)");
        $result = $stmt->execute([$tid, $nombre_personaje, $price, $cantidad]);
        
        if ($result) {
            writeLog("Registro insertado en BD - TXN: $tid, Personaje: $nombre_personaje, Precio: $$price, Cantidad final: $cantidad", 'INFO');
        } else {
            writeLog("ERROR: Falló inserción en BD - TXN: $tid", 'ERROR');
            throw new Exception("Error al insertar en BD");
        }

        // 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) {
            writeLog("Se detectaron items repetidos para el personaje $nombre_personaje", 1);
        }
        

        $pdo->commit();
        writeLog("Transacción de BD confirmada exitosamente", 'INFO');
        writeLog("Pago aprobado #$tid para el personaje $nombre_personaje", 2);

        // Notificar transacción exitosa
        $cantidad_original = $cantidad - $bonus_coins; // Cantidad sin bonus
        // notificarTransaccionExitosa($tid, $nombre_personaje, $cantidad_original, $cantidad, $price, $payer_email);

        // Log al servidor web
        writeLog("TRANSACCIÓN EXITOSA - TXN: $tid, Personaje: $nombre_personaje, Pagado: $$price USD, Coins: $cantidad_original, Bonus: $bonus_coins, Total: $cantidad, Email: $payer_email", 'SUCCESS');
        break;
    case 'charge:failed':
        // Lógica cuando el pago falla
        writeLog("Charge failed: $chargeCode");
        break;
    default:
        // Otro tipo de evento
        writeLog("Evento no manejado: $eventType");
        break;
}

writeLog("Eventos procesados: ".print_r($payload,true));

// Respuesta a Coinbase
http_response_code(200);
echo 'Webhook recibido correctamente.';
?>