<?php
// 🔒 Empêcher l'exécution via navigateur pour plus de sécurité
if (php_sapi_name() !== 'cli') {
    http_response_code(403);
    die("Accès interdit. Ce script doit être lancé en ligne de commande.\n");
}

// 📦 Fichier de suivi d'état pour éviter les alertes en doublon
$stateFile = __DIR__ . '/sites_state.json';
$previousStates = file_exists($stateFile) ? json_decode(file_get_contents($stateFile), true) : [];
$newStates = []; // Pour sauvegarder les états de ce cycle

/**
 * Vérifie l'accessibilité d'un site web
 * @param string $url URL à tester
 * @return array Tableau avec status, code HTTP et message optionnel
 */
function checkWebsite($url) {
    $ch = curl_init();
    
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_FOLLOWLOCATION => true,
        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 => [
            'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language: fr-FR,fr;q=0.9,en;q=0.8',
            'Connection: keep-alive'
        ],
        CURLOPT_NOBODY => false,
        CURLOPT_MAXREDIRS => 5,
    ]);
    
    $result = 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);
    
    curl_close($ch);

    if (php_sapi_name() === 'cli') {
        echo "  → URL finale : $effectiveUrl\n";
        echo "  → Code HTTP : $httpCode\n";
        if ($curlError) {
            echo "  → Erreur cURL ($curlError) : $curlErrorMsg\n";
        }
    }

    if ($curlError) {
        return ['status' => 'DOWN', 'code' => $curlError, 'message' => $curlErrorMsg];
    }
    if ($httpCode >= 200 && $httpCode < 400) {
        return ['status' => 'OK', 'code' => $httpCode];
    }
    if (in_array($httpCode, [403, 406, 429])) {
        return ['status' => 'BLOCKED', 'code' => $httpCode, 'message' => 'Accès refusé (WAF/anti-bot)'];
    }
    if ($httpCode >= 400) {
        return ['status' => 'ERROR', 'code' => $httpCode];
    }
    return ['status' => 'UNKNOWN', 'code' => $httpCode];
}

/**
 * Envoie une alerte via Telegram
 * @param string $url URL du site en panne
 * @param string $details Détails de l'erreur
 * @return bool True si envoyé, False en cas d'échec
 */
function sendTelegramAlert($url, $details = '') {
    // ⚙️ CONFIGURATION - À REMPLACER PAR VOS VALEURS RÉELLES
    $telegramToken = '8833556084:AAGu2llf5Rnz8wKTt18IK_y8_gfio6529jQ'; // 👈 Mettez votre token ici
    $chatId = '1367980456';      // 👈 Mettez votre Chat ID ici
    
    if ($telegramToken === 'VOTRE_TOKEN_ICI' || $chatId === 'VOTRE_CHAT_ID_ICI') {
        error_log("❌ Telegram non configuré");
        return false;
    }
    
    $message = "🚨 *ALERTE : Site indisponible*\n\n";
    $message .= "🔗 *URL* : `" . addslashes($url) . "`\n";
    $message .= "⚠️ *Détails* : " . ($details ?: 'Aucun détail') . "\n";
    $message .= "🕐 *Date* : `" . date('Y-m-d H:i:s') . "`\n";
    $message .= "🖥️ *Serveur* : `" . gethostname() . "`";
    
    $apiUrl = "https://api.telegram.org/bot$telegramToken/sendMessage";
    $postData = [
        'chat_id' => $chatId,
        'text' => $message,
        'parse_mode' => 'Markdown',
        'disable_web_page_preview' => true
    ];
    
    $ch = curl_init($apiUrl);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query($postData),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_HTTPHEADER => ['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);
    
    // Log
    $logFile = __DIR__ . '/telegram.log';
    $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($logFile, $logEntry, FILE_APPEND);
    
    return ($httpCode === 200 && isset($apiResponse['ok']) && $apiResponse['ok'] === true);
}

// 📋 Liste des sites à surveiller
$sites = [
    'https://www.neristechnologies.com',
    'https://www.nerispay.neristechnologies.com',
    'https://leaderteamservice.com',
    'https://elevageformation.com',
    'https://gasbf.com',
    
];

$logFile = __DIR__ . '/monitor.log';
$date = date('Y-m-d H:i:s');

echo "=== Démarrage du monitoring à $date ===\n\n";

foreach ($sites as $site) {
    $result = checkWebsite($site);
    $date = date('Y-m-d H:i:s');
    $currentState = $result['status'];
    $previousState = $previousStates[$site] ?? null;
    
    // Sauvegarder l'état actuel pour le prochain cycle
    $newStates[$site] = $currentState;
    
    switch ($currentState) {
        case 'OK':
            echo "[✅ OK] $date - $site (HTTP {$result['code']})\n";
            
            // 🎯 ALERTER UNIQUEMENT QUAND LE SITE REVIENT EN LIGNE
            // (transition depuis un état problématique)
            if ($previousState === 'DOWN' || $previousState === 'ERROR') {
                sendTelegramAlert($site, "✅ *Le site est de nouveau en ligne*");
                echo "   → 📱 Notification de rétablissement envoyée\n";
            }
            // Si previousState = BLOCKED → pas d'alerte de rétablissement (ce n'était pas une vraie panne)
            break;
            
        case 'BLOCKED':
            echo "[⚠️ BLOQUÉ] $date - $site (HTTP {$result['code']}): {$result['message']}\n";
            file_put_contents($logFile, "$date - BLOQUÉ: $site (HTTP {$result['code']})\n", FILE_APPEND);
            // Pas d'alerte Telegram pour BLOCKED (faux positif)
            break;
            
        case 'DOWN':
        case 'ERROR':
            $errorMsg = $result['message'] ?? 'Site inaccessible';
            echo "[🔴 ERREUR] $date - $site (HTTP {$result['code']}): $errorMsg\n";
            
            // 🎯 ENVOYER UNE ALERTE À CHAQUE FOIS (doublons autorisés)
            $telegramSent = sendTelegramAlert($site, $errorMsg);
            echo ($telegramSent ? "   → 📱 Alert Telegram envoyée\n" : "   → ❌ Échec envoi Telegram\n");
            
            file_put_contents($logFile, "$date - ERREUR: $site (HTTP {$result['code']}) - $errorMsg\n", FILE_APPEND);
            break;
            
        default:
            echo "[❓ INCONNU] $date - $site (HTTP {$result['code']})\n";
            break;
    }
}

// 💾 Sauvegarder les états pour le prochain cycle
file_put_contents($stateFile, json_encode($newStates));

echo "\n=== Monitoring terminé ===\n";
?>