<?php
/**
 * Script de Monitoring de Sites Web
 * Compatible PHP 7.0+
 * Usage CLI : /usr/local/bin/php /home/fasoon5/monitor.php
 */

// 1. Sécurité : Exécution CLI uniquement
if (php_sapi_name() !== 'cli') {
    http_response_code(403);
    header('Content-Type: text/plain');
    die("Acces interdit. Ce script doit etre lance en ligne de commande.\n");
}

// 2. Configuration des chemins
define('BASE_DIR', __DIR__);
define('SITES_FILE', BASE_DIR . '/sites.json');
define('STATE_FILE', BASE_DIR . '/sites_state.json');
define('LOG_FILE', BASE_DIR . '/monitor.log');
define('TELEGRAM_CONFIG', BASE_DIR . '/.telegram_config.php');
define('TELEGRAM_LOG', BASE_DIR . '/telegram.log');

// 3. Chargement configuration Telegram
$tgConfig = array();
if (file_exists(TELEGRAM_CONFIG)) {
    $tgConfig = require TELEGRAM_CONFIG;
}

// 4. Chargement état précédent
$previousStates = array();
if (file_exists(STATE_FILE)) {
    $content = file_get_contents(STATE_FILE);
    if ($content !== false) {
        $decoded = json_decode($content, true);
        if (is_array($decoded)) {
            $previousStates = $decoded;
        }
    }
}

// 5. Chargement liste des sites
$sites = array();
if (file_exists(SITES_FILE)) {
    $content = file_get_contents(SITES_FILE);
    if ($content !== false) {
        $decoded = json_decode($content, true);
        if (is_array($decoded)) {
            $sites = $decoded;
        }
    }
}

// Liste par défaut si vide
if (empty($sites)) {
    $sites = array(
        'https://www.neristechnologies.com',
        'https://www.nerispay.neristechnologies.com',
        'https://leaderteamservice.com'
    );
}

/**
 * Vérifie l'accessibilité d'un site web
 */
function checkWebsite($url) {
    $ch = curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_URL            => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 10,
        CURLOPT_CONNECTTIMEOUT => 5,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_MAXREDIRS      => 5,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_USERAGENT      => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        CURLOPT_HTTPHEADER     => array(
            'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8',
            'Connection: keep-alive'
        ),
        CURLOPT_NOBODY         => false,
        CURLOPT_ENCODING       => ''
    ));

    curl_exec($ch);
    $httpCode     = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError    = curl_errno($ch);
    $curlErrorMsg = curl_error($ch);
    $effectiveUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
    $totalTime    = curl_getinfo($ch, CURLINFO_TOTAL_TIME);
    curl_close($ch);

    // Debug console (CLI uniquement)
    if (php_sapi_name() === 'cli') {
        echo "  -> URL : $effectiveUrl\n";
        echo "  -> Code HTTP : $httpCode\n";
        echo "  -> Temps : " . round($totalTime, 2) . "s\n";
        if ($curlError) {
            echo "  -> Erreur cURL #$curlError : $curlErrorMsg\n";
        }
    }

    if ($curlError) {
        return array('status' => 'DOWN', 'code' => $curlError, 'message' => $curlErrorMsg);
    }

    if ($httpCode >= 200 && $httpCode < 400) {
        return array('status' => 'OK', 'code' => $httpCode);
    }

    if (in_array($httpCode, array(403, 406, 429))) {
        $messages = array(
            403 => 'Acces refuse (WAF/anti-bot)',
            406 => 'Not Acceptable',
            429 => 'Trop de requetes'
        );
        return array('status' => 'BLOCKED', 'code' => $httpCode, 'message' => isset($messages[$httpCode]) ? $messages[$httpCode] : 'Bloque');
    }

    if ($httpCode >= 400) {
        return array('status' => 'ERROR', 'code' => $httpCode, 'message' => "Erreur HTTP $httpCode");
    }

    return array('status' => 'UNKNOWN', 'code' => $httpCode, 'message' => 'Statut non reconnu');
}

/**
 * Envoie une alerte via Telegram
 */
function sendTelegramAlert($url, $details = '') {
    global $tgConfig;
    $token = isset($tgConfig['telegram_token']) ? $tgConfig['telegram_token'] : '';
    $chatId = isset($tgConfig['telegram_chat_id']) ? $tgConfig['telegram_chat_id'] : '';

    if (empty($token) || empty($chatId) || $token === 'VOTRE_TOKEN_ICI' || $chatId === 'VOTRE_CHAT_ID_ICI') {
        error_log("[" . date('Y-m-d H:i:s') . "] Telegram non configure");
        return false;
    }

    $emoji = (strpos($details, '✅') !== false) ? '🟢' : '🚨';
    $message = "$emoji *ALERTE MONITORING*\n\n";
    $message .= "🔗 *URL* : `" . addslashes($url) . "`\n";
    $message .= "⚠️ *Details* : " . ($details ?: 'Aucun detail') . "\n";
    $message .= " *Date* : `" . date('d/m/Y H:i:s') . "`\n";
    $message .= "🖥️ *Serveur* : `" . gethostname() . "`";

    $apiUrl = "https://api.telegram.org/bot$token/sendMessage";
    $postData = array(
        'chat_id' => $chatId,
        'text' => $message,
        'parse_mode' => 'Markdown',
        'disable_web_page_preview' => true
    );

    $ch = curl_init($apiUrl);
    curl_setopt_array($ch, array(
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query($postData),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded')
    ));

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError = curl_error($ch);
    curl_close($ch);

    $logEntry = date('Y-m-d H:i:s') . " - Telegram API: HTTP $httpCode";
    if ($curlError) {
        $logEntry .= " - cURL Error: $curlError";
    }
    $apiResponse = json_decode($response, true);
    if ($apiResponse && isset($apiResponse['description'])) {
        $logEntry .= " - API: {$apiResponse['description']}";
    }
    $logEntry .= "\n";

    file_put_contents(TELEGRAM_LOG, $logEntry, FILE_APPEND | LOCK_EX);

    return ($httpCode === 200 && isset($apiResponse['ok']) && $apiResponse['ok'] === true);
}

/**
 * Écrit dans le log principal
 */
function logMessage($msg) {
    $entry = date('Y-m-d H:i:s') . " - $msg\n";
    file_put_contents(LOG_FILE, $entry, FILE_APPEND | LOCK_EX);
}

// 6. Démarrage du monitoring
$date = date('Y-m-d H:i:s');
echo "=== Démarrage du monitoring à $date ===\n";
echo "Sites à vérifier : " . count($sites) . "\n\n";
logMessage("=== MONITORING START === Sites: " . count($sites));

$newStates = array();

foreach ($sites as $site) {
    $site = rtrim($site, '/');
    $result = checkWebsite($site);
    $date = date('Y-m-d H:i:s');
    $currentState = $result['status'];
    $previousState = isset($previousStates[$site]) ? $previousStates[$site] : null;

    // Sauvegarde état actuel
    $newStates[$site] = $currentState;

    switch ($currentState) {
        case 'OK':
            echo "[✅ OK] $date - $site (HTTP {$result['code']})\n";
            // Alerte UNIQUEMENT quand le site REVIENT EN LIGNE
            if ($previousState === 'DOWN' || $previousState === 'ERROR') {
                $sent = sendTelegramAlert($site, "✅ *Le site est de nouveau en ligne*\nHTTP {$result['code']}");
                echo "   → Telegram " . ($sent ? "envoyé ✅" : "échoué ❌") . "\n";
                logMessage("RECOVERY: $site");
            }
            break;

        case 'BLOCKED':
            echo "[⚠️ BLOQUÉ] $date - $site (HTTP {$result['code']}): {$result['message']}\n";
            logMessage("BLOCKED: $site - {$result['message']}");
            // Pas d'alerte pour BLOCKED (faux positif)
            break;

        case 'DOWN':
        case 'ERROR':
            $errorMsg = isset($result['message']) ? $result['message'] : 'Site inaccessible';
            echo "[🔴 ERREUR] $date - $site (HTTP {$result['code']}): $errorMsg\n";
            
            // Alerte À CHAQUE FOIS (doublons autorisés comme demandé)
            $sent = sendTelegramAlert($site, $errorMsg);
            echo "   → Telegram " . ($sent ? "envoyé ✅" : "échoué ❌") . "\n";
            logMessage("ERROR: $site - $errorMsg");
            break;

        default:
            echo "[❓ INCONNU] $date - $site (HTTP {$result['code']})\n";
            logMessage("UNKNOWN: $site");
            break;
    }
    usleep(200000); // Pause 200ms entre chaque site
}

// 7. Sauvegarde des états
file_put_contents(STATE_FILE, json_encode($newStates, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES), LOCK_EX);

// 8. Résumé final
$okCount = 0; $blockedCount = 0; $errorCount = 0;
foreach ($newStates as $s) {
    if ($s === 'OK') $okCount++;
    elseif ($s === 'BLOCKED') $blockedCount++;
    elseif ($s === 'DOWN' || $s === 'ERROR') $errorCount++;
}

echo "\n=== Résumé ===\n";
echo "✅ OK : $okCount\n";
echo "⚠️  Bloqués : $blockedCount\n";
echo " Erreurs : $errorCount\n";
echo "=== Monitoring terminé à " . date('Y-m-d H:i:s') . " ===\n";

logMessage("=== MONITORING END === OK:$okCount BLOCKED:$blockedCount ERROR:$errorCount");

// Code de sortie pour Cron (0 = succès, 1 = erreurs détectées)
exit($errorCount > 0 ? 1 : 0);
?>