<?php
// Caminho para o .phar do GeoIP2
require_once '/var/www/signals/geoip2.phar';

use MaxMind\Db\Reader;

// Token obrigatório para uso da API
$TOKEN_ESPERADO = 'longb2025';
if (!isset($_GET['token']) || $_GET['token'] !== $TOKEN_ESPERADO) {
    http_response_code(403);
    header('Content-Type: application/json');
    echo json_encode(['error' => 'Token inválido ou ausente']);
    exit;
}

// Função para detectar o IP real do visitante
function getClientIp() {
    if (isset($_GET['ip']) && filter_var($_GET['ip'], FILTER_VALIDATE_IP)) {
        return $_GET['ip'];
    }
    if (!empty($_SERVER['HTTP_CF_CONNECTING_IP']) && filter_var($_SERVER['HTTP_CF_CONNECTING_IP'], FILTER_VALIDATE_IP)) {
        return $_SERVER['HTTP_CF_CONNECTING_IP'];
    }
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $ip = trim($ips[0]);
        if (filter_var($ip, FILTER_VALIDATE_IP)) {
            return $ip;
        }
    }
    if (!empty($_SERVER['REMOTE_ADDR']) && filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP)) {
        return $_SERVER['REMOTE_ADDR'];
    }
    return '0.0.0.0'; // fallback
}

$ip = getClientIp();

// Caminho para o banco de dados MaxMind
$dbPath = '/var/lib/GeoIP/GeoLite2-City.mmdb';

// Função para normalizar strings (remover acentos, deixar em formato seguro)
function normalizeString($string) {
    if (!$string) return null;
    $string = iconv('UTF-8', 'ASCII//TRANSLIT', $string); // remove acentos
    return trim(preg_replace('/[^A-Za-z0-9 ]/', '', $string)); // só letras/números/espaços
}

// Função para gerar SHA256 lowercase
function hashValue($value) {
    return $value ? hash('sha256', strtolower(trim($value))) : null;
}

try {
    $reader = new Reader($dbPath);
    $record = $reader->get($ip);

    // Captura dados brutos
    $country = $record['country']['iso_code'] ?? null; // ISO code (BR, US...)
    $region  = $record['subdivisions'][0]['names']['en'] ?? null;
    $city    = $record['city']['names']['en'] ?? null;

    // Normaliza strings (sem acento, só ascii)
    $regionNorm = normalizeString($region);
    $cityNorm   = normalizeString($city);

    // Monta a resposta
    $response = [
        'ip'      => $ip,
        'country' => $country,
        'region'  => $regionNorm,
        'city'    => $cityNorm,
        'hash'    => [
            'country' => hashValue($country),
            'region'  => hashValue($regionNorm),
            'city'    => hashValue($cityNorm)
        ]
    ];

    header('Content-Type: application/json');
    echo json_encode($response);

} catch (Exception $e) {
    http_response_code(500);
    header('Content-Type: application/json');
    echo json_encode([
        'error' => 'GeoIP lookup failed',
        'message' => $e->getMessage()
    ]);
}
