<?php
declare(strict_types=1);

error_reporting(E_ALL);
ini_set('display_errors', '1');

require_once __DIR__ . '/db.php';
require_once __DIR__ . '/Cloudflare.php';
require_once __DIR__ . '/Telegram.php';

function isNodeAlive(string $ip, int $port = 443, int $timeout = 3): bool {
    $fp = @fsockopen($ip, $port, $errno, $errstr, $timeout);
    if (is_resource($fp)) {
        fclose($fp);
        return true;
    }
    return false;
}

echo "<!DOCTYPE html><html dir='rtl' lang='fa'><head><meta charset='utf-8'><title>مانیتورینگ نودها</title>";
echo "<style>body{font-family:tahoma,arial;padding:20px;background:#f4f6f9;color:#333;} .card{background:#fff;padding:15px;margin-bottom:15px;border-radius:8px;box-shadow:0 2px 4px rgba(0,0,0,0.1);} .badge{padding:4px 8px;border-radius:4px;color:#fff;font-size:12px;} .green{background:#28a745;} .red{background:#dc3545;} .yellow{background:#ffc107;color:#000;}</style></head><body>";
echo "<h2>🔍 در حال اجرای اسکریپت مانیتورینگ نودها...</h2>";

// واکشی کامل اطلاعات نودها به همراه گروه‌ها، پنل و کلودفلر
$stmt = $pdo->query("
    SELECT 
        n.*, 
        ca.name AS cf_account_name, 
        ca.api_token AS cf_api_token, 
        p.name AS panel_name, 
        p.panel_type,
        COALESCE(g.name, 'عمومی') AS resolved_group_name
    FROM nodes n
    JOIN cloudflare_accounts ca ON n.cf_account_id = ca.id
    JOIN panels p ON n.panel_id = p.id
    LEFT JOIN panel_groups g ON n.group_id = g.id
");
$nodes = $stmt->fetchAll();

if (empty($nodes)) {
    echo "<div class='card'><b style='color:red;'>⚠️ هیچ نودی در دیتابیس یافت نشد!</b></div></body></html>";
    exit;
}

foreach ($nodes as $node) {
    echo "<div class='card'>";
    $port = !empty($node['check_port']) ? (int)$node['check_port'] : 443;
    $country = !empty($node['country']) ? $node['country'] : 'نامشخص';
    
    echo "<h3>🔹 نود: {$node['name']} [{$country}] - گروه: {$node['resolved_group_name']}</h3>";
    echo "📡 آی‌پی اصلی: <code>{$node['main_ip']}</code> | پورت تست: <code>{$port}</code><br>";
    echo "🌐 ساب‌دامین: <code>{$node['domain_name']}</code> | آی‌پی فعال فعلی: <code>{$node['current_ip']}</code><br>";

    $isOnline = isNodeAlive($node['main_ip'], $port);

    if ($isOnline) {
        echo "وضعیت اتصال: <span class='badge green'>آنلاین (Online)</span><br>";
    } else {
        echo "وضعیت اتصال: <span class='badge red'>قطع (Offline / Timed Out)</span><br>";
    }

    // نود در حالت تغییر دستی است
    if ($node['status'] === 'manual_override') {
        echo "<span class='badge yellow'>نود در حالت دستی (Manual) است؛ تغییر خودکار اعمال نمی‌شود.</span><br>";
        echo "</div>";
        continue;
    }

    // ۱. نود قطع است -> انتقال خودکار به زاپاس
    if (!$isOnline && empty($node['assigned_backup_id'])) {
        echo "<b style='color:red;'>⚠️ نود قطع است! در حال اتصال به کلودفلر برای جایگزینی زاپاس...</b><br>";

        $bStmt = $pdo->prepare("SELECT * FROM backup_nodes WHERE panel_id = ? AND is_busy = 0 LIMIT 1");
        $bStmt->execute([$node['panel_id']]);
        $backup = $bStmt->fetch();

        if ($backup) {
            $cfError = '';
            $cfUpdated = Cloudflare::updateRecord(
                $node['cf_api_token'],
                $node['zone_id'],
                $node['record_id'],
                $node['domain_name'],
                $backup['ip'],
                (bool)$node['proxied'],
                $cfError
            );

            if ($cfUpdated) {
                $pdo->prepare("UPDATE backup_nodes SET is_busy = 1 WHERE id = ?")->execute([$backup['id']]);
                $pdo->prepare("
                    UPDATE nodes 
                    SET current_ip = ?, status = 'offline', assigned_backup_id = ? 
                    WHERE id = ?
                ")->execute([$backup['ip'], $backup['id'], $node['id']]);

                echo "<b style='color:green;'>✅ آی‌پی در کلودفلر روی زاپاس ({$backup['ip']}) ست شد!</b><br>";

                $pType = strtoupper($node['panel_type']);
                $msg = "🔴 <b>هشدار: قطعی نود و سوییچ به زاپاس</b>\n\n"
                     . "🏷 <b>نود:</b> {$node['name']}\n"
                     . "🌍 <b>کشور:</b> {$country}\n"
                     . "👥 <b>گروه:</b> {$node['resolved_group_name']}\n"
                     . "🏢 <b>پنل:</b> {$node['panel_name']} ({$pType})\n"
                     . "🌐 <b>ساب‌دامین:</b> <code>{$node['domain_name']}</code>\n"
                     . "❌ <b>آی‌پی قطع شده:</b> <code>{$node['main_ip']}</code>\n"
                     . "🔄 <b>آی‌پی زاپاس فعال شد:</b> <code>{$backup['ip']}</code> ({$backup['name']})\n"
                     . "⏱ <b>زمان:</b> " . date('Y-m-d H:i:s');
                Telegram::sendMessage($msg);
            } else {
                echo "<b style='color:red;'>❌ خطا در کلودفلر: {$cfError}</b><br>";
            }
        } else {
            echo "<b style='color:red;'>❌ هیچ سرور زاپاس آزادی برای این پنل یافت نشد!</b><br>";
        }
    }

    // ۲. نود وصل شد -> بازگردانی خودکار به آی‌پی اصلی
    if ($isOnline && !empty($node['assigned_backup_id'])) {
        echo "<b style='color:green;'>نود اصلی وصل شد! در حال بازگردانی به آی‌پی اصلی...</b><br>";

        $cfError = '';
        $cfUpdated = Cloudflare::updateRecord(
            $node['cf_api_token'],
            $node['zone_id'],
            $node['record_id'],
            $node['domain_name'],
            $node['main_ip'],
            (bool)$node['proxied'],
            $cfError
        );

        if ($cfUpdated) {
            $bStmt = $pdo->prepare("SELECT name, ip FROM backup_nodes WHERE id = ?");
            $bStmt->execute([$node['assigned_backup_id']]);
            $released = $bStmt->fetch();

            $pdo->prepare("UPDATE backup_nodes SET is_busy = 0 WHERE id = ?")->execute([$node['assigned_backup_id']]);
            $pdo->prepare("
                UPDATE nodes 
                SET current_ip = main_ip, status = 'online', assigned_backup_id = NULL 
                WHERE id = ?
            ")->execute([$node['id']]);

            echo "<b style='color:green;'>✅ آی‌پی اصلی در کلودفلر ست و زاپاس آزاد شد.</b><br>";

            $pType = strtoupper($node['panel_type']);
            $bText = $released ? "<code>{$released['ip']}</code> ({$released['name']})" : "زاپاس قبلی";
            $msg = "🟢 <b>گزارش: بازگشت نود به مدار</b>\n\n"
                 . "🏷 <b>نود:</b> {$node['name']}\n"
                 . "🌍 <b>کشور:</b> {$country}\n"
                 . "👥 <b>گروه:</b> {$node['resolved_group_name']}\n"
                 . "🏢 <b>پنل:</b> {$node['panel_name']} ({$pType})\n"
                 . "🌐 <b>ساب‌دامین:</b> <code>{$node['domain_name']}</code>\n"
                 . "✅ <b>آی‌پی اصلی متصل شد:</b> <code>{$node['main_ip']}</code>\n"
                 . "🆓 <b>زاپاس آزاد شد:</b> {$bText}\n"
                 . "⏱ <b>زمان:</b> " . date('Y-m-d H:i:s');
            Telegram::sendMessage($msg);
        } else {
            echo "<b style='color:red;'>❌ خطا در بازگردانی کلودفلر: {$cfError}</b><br>";
        }
    }

    echo "</div>";
}

echo "<h3>✅ بررسی مانیتورینگ با موفقیت به پایان رسید.</h3></body></html>";