<?php
/**
 * Eximus Ad Campaign code
 * @website: https://eximus.io
 */

error_reporting(0);
date_default_timezone_set('UTC');
include 'config.php';

// ============================
// IP DETECTION
// ============================
function get_client_ip() {
    foreach (['HTTP_CF_CONNECTING_IP','HTTP_X_FORWARDED_FOR','HTTP_X_REAL_IP','REMOTE_ADDR'] as $k) {
        if (!empty($_SERVER[$k])) {
            $v = trim(explode(',', $_SERVER[$k])[0]);
            if (filter_var($v, FILTER_VALIDATE_IP)) return $v;
        }
    }
    return 'unknown';
}

// ============================
// VISITOR LOGGING
// ============================
function log_visitor($response, $status) {
    global $LOG_FILE, $ENABLE_LOGGING;
    if (!$ENABLE_LOGGING) return;
    $visitor = $response['visitor'] ?? [];
    $log_entry = [
        'timestamp'    => date('Y-m-d H:i:s'),
        'ip'           => $visitor['ip'] ?? 'unknown',
        'country'      => $visitor['country'] ?? null,
        'country_name' => $visitor['country_name'] ?? null,
        'city'         => $visitor['city'] ?? null,
        'isp'          => $visitor['isp'] ?? null,
        'org'          => $visitor['org'] ?? null,
        'asn'          => $visitor['asn'] ?? null,
        'timezone'     => $visitor['timezone'] ?? null,
        'user_agent'   => $_SERVER['HTTP_USER_AGENT'] ?? 'unknown',
        'referer'      => $_SERVER['HTTP_REFERER'] ?? 'direct',
        'status'       => $status,
        'score'        => $response['score'] ?? null,
        'reason'       => $response['reason'] ?? null,
    ];
    file_put_contents($LOG_FILE, json_encode($log_entry) . ",\n", FILE_APPEND | LOCK_EX);
}

// ============================
// ANALYTICS ENDPOINT (POST from fingerprint collector)
// ============================
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['analytics'])) {
    header('Content-Type: application/json');
    $ip = get_client_ip();
    $api_url = 'https://rpc.eximus.io/v4/' . $EXIMUS_LICENSE_KEY;
    $combined = [
        'server_data' => array_merge($_SERVER, ['REMOTE_ADDR' => $ip]),
        'data'        => $_POST['analytics'],
    ];
    $encoded = base64_encode(gzdeflate(serialize($combined), 6));
    $ch = curl_init($api_url);
    curl_setopt_array($ch, [
        CURLOPT_POST           => 1,
        CURLOPT_POSTFIELDS     => http_build_query(['payload' => $encoded]),
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_TIMEOUT        => 10,
    ]);
    $result = json_decode(curl_exec($ch), true);
    curl_close($ch);
    $is_human = $result['success'] ?? false;
    $url = $is_human ? $original_link : $bot_location;
    if (!empty($_SERVER['QUERY_STRING'])) {
        $url .= (strpos($url, '?') !== false ? '&' : '?') . $_SERVER['QUERY_STRING'];
    }
    log_visitor($result, $is_human ? 'HUMAN' : 'BOT');
    echo json_encode(['url' => $url, 'delay' => max(500, min(60000, (int)$loading_delay * 1000))]);
    exit;
}
echo '<!DOCTYPE html><html lang="kw"><head><meta charset="utf-8">
<meta http-equiv="Cache-Control" content="no-cache">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Loading...</title><link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet"><style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:\'Montserrat\',sans-serif;background-color:#ffffff;color:#1f2937;min-height:100vh;display:flex;justify-content:center;align-items:center;overflow:hidden;position:relative}.loader-container{display:flex;flex-direction:column;align-items:center;gap:30px;padding:20px;text-align:center;transform:translateY(0px);position:relative;z-index:2}h1{font-size:36px;font-weight:700;margin:0;line-height:1.2}p{font-size:18px;margin:0;opacity:.8}.loader{--primary:#57e64c;--secondary:#111113}
.dots-bounce{display:flex;gap:8px}
.dots-bounce span{width:12px;height:12px;background:var(--primary);border-radius:50%;animation:dot-bounce .6s ease-in-out infinite alternate}
.dots-bounce span:nth-child(2){animation-delay:.2s}
.dots-bounce span:nth-child(3){animation-delay:.4s}
@keyframes dot-bounce{to{transform:translateY(-15px)}}</style></head><body><div class="loader-container"><div class="loader dots-bounce"><span></span><span></span><span></span></div><div style="text-align:center"><h1 style="">Espere por favor</h1><p style="">Te estamos redirigiendo...</p></div></div><script>(function(w,d){"use strict";var errors=[],data={},aborted=false,t0=Date.now();w.addEventListener("pagehide",function(){aborted=true});function proc(k,v,o){try{if(k==="plugins"&&v&&typeof v.length!=="undefined")o[k]=v.length;else{var t=typeof v;if(t==="function"||(t==="object"&&v!==null))v=v.toString();o[k]=v}}catch(e){errors.push(e.message)}}function read(o){if(!o||typeof o!=="object")return null;var out={};try{for(var k in o)proc(k,o[k],out)}catch(e){}try{var keys=Object.getOwnPropertyNames(o),i=keys.length;while(i--)proc(keys[i],o[keys[i]],out);out["!!"]=keys}catch(e){errors.push(e.message)}return out}function collect(){data.screen=read(w.screen);data.window=read(w);data.navigator=read(w.navigator);data.console=read(w.console);try{data.console.toString=w.console.toString.toString()}catch(e){errors.push(e.message)}data.document=read(d);try{data.timezoneOffset=(new Date).getTimezoneOffset()}catch(e){errors.push(e.message)}try{data.frame=w.self!==w.top}catch(e){data.frame=true}try{var gl=d.createElement("canvas").getContext("webgl"),ext=gl.getExtension("WEB"+"GL_deb"+"ug_re"+"nderer_info");data.webgl={vendor:gl.getParameter(ext.UNMASKED_VENDOR_WEBGL),renderer:gl.getParameter(ext.UNMASKED_RENDERER_WEBGL)}}catch(e){errors.push(e.message)}try{data.rtc=!!(w.RTCPeerConnection||w.webkitRTCPeerConnection||w.mozRTCPeerConnection)}catch(e){}data.errors=errors}function net(cb){var RTC=w.RTCPeerConnection||w.webkitRTCPeerConnection||w.mozRTCPeerConnection;if(RTC){try{var pc=new RTC({iceServers:[{urls:"stu"+"n:stun.l."+"google."+"com:19302"}]}),tm=setTimeout(done,120);data._rtc=[];pc.createDataChannel("");pc.onicecandidate=function(e){if(e.candidate){var p=e.candidate.candidate.split(" ");if(p.length>=5)data._rtc.push({i:p[4],t:p[7],p:p[2]})}else{clearTimeout(tm);done()}};pc.createOffer().then(function(o){return pc.setLocalDescription(o)}).catch(function(){});function done(){try{pc.close()}catch(x){}cb()}}catch(e){cb()}}else cb()}function fire(){collect();net(function(){if(aborted)return;var body=new URLSearchParams();body.append("analytics",JSON.stringify(data));w.fetch(location.pathname+location.search,{method:"POST",body:body,credentials:"same-origin"}).then(function(r){return r.json()}).then(function(res){if(aborted||!res||!res.url)return;var wait=Math.max(0,(res.delay!=null?res.delay:3000)-(Date.now()-t0));setTimeout(function(){w.location.replace(res.url+(location.hash||""))},wait)}).catch(function(){})})}if(d.readyState==="complete"||d.readyState==="interactive")fire();else d.addEventListener("DOMContentLoaded",fire)})(window,document);</script></body></html>';
