<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ACGHX VPN 配置中心</title>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdn.tailwindcss.com"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <script>
        tailwind.config = {
            theme: {
                extend: {
                    colors: {
                        primary: '#1e40af',
                        secondary: '#1e3a8a',
                        accent: '#3b82f6',
                        success: '#059669',
                        warning: '#d97706',
                        danger: '#dc2626',
                        dark: '#0f172a',
                        'business-blue': '#2563eb',
                        'light-blue': '#60a5fa',
                        'card-bg': 'rgba(255, 255, 255, 0.95)',
                        'border-light': 'rgba(37, 99, 235, 0.2)'
                    },
                    animation: {
                        'fade-in': 'fadeIn 0.5s ease-in-out',
                        'slide-up': 'slideUp 0.3s ease-out',
                        'pulse-slow': 'pulse 3s cubic-bezier(0.4, 0, 0.6, 1) infinite'
                    }
                }
            }
        }
    </script>
    <style>
        @keyframes fadeIn {
            from { opacity: 0; }
            to { opacity: 1; }
        }
        @keyframes slideUp {
            from { opacity: 0; transform: translateY(20px); }
            to { opacity: 1; transform: translateY(0); }
        }
        .glass-effect {
            background: rgba(255, 255, 255, 0.1);
            backdrop-filter: blur(10px);
            border: 1px solid rgba(255, 255, 255, 0.2);
        }
        .gradient-bg {
            background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
            min-height: 100vh;
        }
        .status-panel {
            background: #ffffff;
            border: 1px solid #e2e8f0;
            box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
        }
        .status-operational {
            background: linear-gradient(135deg, #10b981 0%, #059669 100%);
            box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
        }
        .status-warning {
            background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
            box-shadow: 0 4px 12px rgba(245, 158, 11, 0.3);
        }
        .status-error {
            background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
            box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);
        }
        .glass-effect {
            background: rgba(255, 255, 255, 0.95);
            backdrop-filter: blur(10px);
            border: 1px solid rgba(255, 255, 255, 0.2);
        }
        .progress-bar-online {
            background: linear-gradient(90deg, #10b981 0%, #059669 50%, #047857 100%);
            box-shadow: 0 0 10px rgba(16, 185, 129, 0.3);
        }
        .progress-bar-offline {
            background: linear-gradient(90deg, #ef4444 0%, #dc2626 50%, #b91c1c 100%);
            box-shadow: 0 0 10px rgba(239, 68, 68, 0.3);
        }
        .progress-bar-warning {
            background: linear-gradient(90deg, #f59e0b 0%, #d97706 50%, #b45309 100%);
            box-shadow: 0 0 10px rgba(245, 158, 11, 0.3);
        }
        .progress-container {
            background: rgba(0, 0, 0, 0.1);
            border-radius: 10px;
            overflow: hidden;
            position: relative;
        }
        .progress-container::before {
            content: '';
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.2) 50%, transparent 100%);
            animation: shimmer 2s infinite;
        }
        @keyframes shimmer {
            0% { transform: translateX(-100%); }
            100% { transform: translateX(100%); }
        }
    </style>
</head>
<body class="min-h-screen gradient-bg">
    <div id="app">
        <!-- 导航栏 -->
        <nav class="bg-white shadow-sm border-b border-gray-200">
            <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
                <div class="flex justify-between items-center h-16">
                    <div class="flex items-center">
                        <div class="flex-shrink-0">
                            <h1 class="text-xl font-bold text-business-blue">
                                <i class="fas fa-shield-alt mr-2 text-business-blue"></i>
                                ACGHX VPN
                            </h1>
                        </div>
                        <div class="hidden md:block ml-10">
                            <div class="flex items-baseline space-x-4">
                                <a href="#" @click="currentViewGo('home')" 
                                   :class="currentView === 'home' ? 'text-business-blue border-business-blue' : 'text-gray-500 hover:text-gray-700'" 
                                   class="border-b-2 border-transparent px-3 py-2 text-sm font-medium transition-colors">
                                    首页
                                </a>
                                <a href="#" @click="currentViewGo('apps')" 
                                   :class="currentView === 'apps' ? 'text-business-blue border-business-blue' : 'text-gray-500 hover:text-gray-700'"
                                   class="border-b-2 border-transparent px-3 py-2 text-sm font-medium transition-colors">
                                    应用下载
                                </a>
                            </div>
                        </div>
                    </div>
                    
                    <!-- 移动端菜单按钮 -->
                    <div class="md:hidden">
                        <button @click="mobileMenuOpen = !mobileMenuOpen" 
                                class="text-gray-500 hover:text-gray-700 focus:outline-none">
                            <i class="fas fa-bars text-xl"></i>
                        </button>
                    </div>
                    
                    <!-- 认证状态 -->
                    <div class="hidden md:flex items-center">
                        <div v-if="isAuthenticated" class="flex items-center text-green-600">
                            <i class="fas fa-check-circle mr-2"></i>
                            <span class="text-sm">已认证</span>
                        </div>
                        <div v-else class="flex items-center text-gray-500">
                            <i class="fas fa-lock mr-2"></i>
                            <span class="text-sm">未认证</span>
                        </div>
                    </div>
                </div>
                
                <!-- 移动端菜单 -->
                <div v-show="mobileMenuOpen" class="md:hidden animate-slide-up bg-gray-50 border-t">
                    <div class="px-2 pt-2 pb-3 space-y-1">
                        <a href="#" @click="currentView = 'home'; mobileMenuOpen = false" 
                           class="text-gray-700 hover:text-business-blue block px-3 py-2 text-base font-medium">
                            首页
                        </a>
                        <a href="#" @click="currentView = 'apps'; mobileMenuOpen = false" 
                           class="text-gray-700 hover:text-business-blue block px-3 py-2 text-base font-medium">
                            应用下载
                        </a>
                    </div>
                </div>
            </div>
        </nav>

        <!-- 主内容区域 -->
        <main class="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
            <!-- 登录表单 -->
            <div v-if="!isAuthenticated && currentView === 'home'" class="flex items-center justify-center min-h-96">
                <div class="glass-effect rounded-xl p-8 w-full max-w-md animate-fade-in">
                    <div class="text-center mb-6">
                        <i class="fas fa-key text-4xl text-accent mb-4"></i>
                        <h2 class="text-2xl font-bold text-white mb-2">认证登录</h2>
                        <p class="text-gray-300">请输入访问密码以查看 VPN 配置</p>
                    </div>
                    
                    <form @submit.prevent="authenticate">
                        <div class="mb-6">
                            <input 
                                v-model="password"
                                type="password" 
                                placeholder="请输入密码"
                                class="w-full px-4 py-3 rounded-lg bg-white/20 border border-white/30 text-white placeholder-gray-300 focus:outline-none focus:ring-2 focus:ring-accent focus:border-transparent transition-all"
                                required>
                        </div>
                        
                        <button 
                            type="submit" 
                            :disabled="loading"
                            class="w-full bg-accent hover:bg-accent/80 disabled:bg-accent/50 text-white font-medium py-3 px-4 rounded-lg transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-accent/50">
                            <span v-if="loading">
                                <i class="fas fa-spinner fa-spin mr-2"></i>
                                认证中...
                            </span>
                            <span v-else>
                                <i class="fas fa-sign-in-alt mr-2"></i>
                                登录
                            </span>
                        </button>
                    </form>
                    
                    <!-- 错误提示 -->
                    <div v-if="error" class="mt-4 p-3 rounded-lg bg-red-500/20 border border-red-500/30">
                        <p class="text-red-200 text-sm flex items-center">
                            <i class="fas fa-exclamation-triangle mr-2"></i>
                            {{ error }}
                        </p>
                    </div>
                </div>
            </div>

            <!-- VPN 可用度监控页面 -->
            <div v-if="isAuthenticated && currentView === 'home'" class="animate-fade-in max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
                <!-- 页面标题 -->
                <div class="text-center mb-12">
                    <h1 class="text-4xl font-bold text-gray-900 mb-3 tracking-tight">VPN 服务状态</h1>
                    <p class="text-lg text-gray-600 max-w-2xl mx-auto">实时监控所有VPN服务器的连接状态和延迟</p>
                </div>
                
                <!-- 总体状态指示器 -->
                <div class="bg-white rounded-2xl shadow-sm border border-gray-100 p-8 mb-10 text-center">
                    <!-- 刷新按钮 -->
                    <div class="text-center mb-10">
                        <button @click="refreshAllServers" 
                                :disabled="isRefreshing"
                                class="bg-gradient-to-r from-blue-500 to-blue-600 hover:from-blue-600 hover:to-blue-700 disabled:from-gray-400 disabled:to-gray-500 text-white font-medium py-3 px-8 rounded-xl transition-all duration-300 shadow-lg hover:shadow-xl transform hover:-translate-y-0.5 disabled:transform-none">
                            <span v-if="isRefreshing" class="flex items-center">
                                <i class="fas fa-spinner fa-spin mr-3"></i>
                                检测中...
                            </span>
                            <span v-else class="flex items-center">
                                <i class="fas fa-sync-alt mr-3"></i>
                                刷新所有状态
                            </span>
                        </button>
                    </div>
                    <div class="text-sm text-gray-500 mt-4 space-x-6">
                        <span class="inline-flex items-center">
                            <span class="w-2 h-2 bg-green-500 rounded-full mr-2"></span>
                            在线: <strong class="ml-1">{{ onlineCount }}</strong>
                        </span>
                        <span class="inline-flex items-center">
                            <span class="w-2 h-2 bg-red-500 rounded-full mr-2"></span>
                            离线: <strong class="ml-1">{{ offlineCount }}</strong>
                        </span>
                        <span class="inline-flex items-center">
                            <span class="w-2 h-2 bg-gray-400 rounded-full mr-2"></span>
                            总计: <strong class="ml-1">{{ totalServers }}</strong>
                        </span>
                    </div>
                </div>
                
                
                
                <!-- Current Status 标题 -->
                <div class="mb-8">
                    <h2 class="text-2xl font-bold text-gray-900 tracking-tight">Current Status: VPN Services</h2>
                    <div class="w-16 h-1 bg-gradient-to-r from-blue-500 to-purple-500 rounded-full mt-2"></div>
                </div>

                <!-- 服务状态网格 -->
                <div class="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-12">
                    <div v-for="(servers, region) in vpnConfigs" :key="region" 
                         class="bg-white rounded-2xl shadow-sm border border-gray-100 overflow-hidden hover:shadow-md transition-shadow duration-300">
                        
                        <!-- 区域标题 -->
                        <div class="bg-gradient-to-r from-gray-50 to-gray-100 px-6 py-4 border-b border-gray-100">
                            <div class="flex items-center justify-between">
                                <h3 class="text-lg font-semibold text-gray-900 flex items-center">
                                    <i class="fas fa-globe-americas mr-3 text-blue-500"></i>
                                    {{ region }}
                                </h3>
                                <div class="flex items-center space-x-2">
                                    <span class="text-xs font-medium text-gray-500 bg-white px-2 py-1 rounded-full">
                                        {{ getRegionStatus(region) }}
                                    </span>
                                </div>
                            </div>
                        </div>
                        
                        <!-- 服务器列表 -->
                        <div class="p-6">
                            <div class="space-y-4">
                                <div v-for="server in servers" :key="server.id" 
                                     class="group relative bg-gray-50 hover:bg-blue-50 rounded-xl p-4 transition-all duration-200">
                                    
                                    <div class="flex items-center justify-between">
                                        <div class="flex items-center flex-1 min-w-0">
                                            <!-- 服务器名称 -->
                                            <div class="flex-1 min-w-0">
                                                <h4 class="text-sm font-semibold text-gray-900 truncate mb-1">{{ server.name }}</h4>
                                                <p class="text-xs text-gray-500">{{ server.server }}</p>
                                            </div>
                                            
                                            <!-- 延迟信息 -->
                                            <div v-if="serverStatus[server.id]?.latency > 0" 
                                                 class="text-xs font-medium text-gray-600 bg-white px-2 py-1 rounded-full mr-3">
                                                {{ serverStatus[server.id]?.latency }}ms
                                            </div>
                                        </div>
                                        
                                        <!-- 状态区域 -->
                                        <div class="flex items-center space-x-3">
                                            <!-- 测试按钮 -->
                                            <button @click="testServer(server)" 
                                                    :disabled="testingServers.includes(server.id)"
                                                    class="opacity-0 group-hover:opacity-100 transition-opacity duration-200 p-1.5 hover:bg-blue-100 rounded-lg"
                                                    :class="testingServers.includes(server.id) ? 'opacity-100' : ''">
                                                <span v-if="testingServers.includes(server.id)">
                                                    <i class="fas fa-spinner fa-spin text-blue-500 text-sm"></i>
                                                </span>
                                                <span v-else>
                                                    <i class="fas fa-redo text-gray-400 hover:text-blue-500 text-sm"></i>
                                                </span>
                                            </button>
                                            
                                            <!-- 状态指示器 -->
                                            <div class="flex items-center space-x-2">
                                                <div :class="getStatusIconClass(server.id)" 
                                                     class="w-3 h-3 rounded-full flex-shrink-0 shadow-sm"></div>
                                                <span :class="getStatusTextClassSimple(server.id)" 
                                                      class="text-sm font-medium">
                                                    {{ getServerStatusSimple(server.id) }}
                                                </span>
                                            </div>
                                        </div>
                                    </div>
                                    
                                    <!-- 最后检测时间 -->
                                    <div v-if="serverStatus[server.id]?.timestamp" 
                                         class="text-xs text-gray-400 mt-3 pt-2 border-t border-gray-200">
                                        最后检测: {{ formatTimestamp(serverStatus[server.id].timestamp) }}
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                
                <!-- 页脚信息 -->
                <div class="bg-white rounded-2xl shadow-sm border border-gray-100 p-8 text-center">
                    <div class="space-y-4">
                        <div class="flex items-center justify-center space-x-6 text-sm text-gray-600">
                            <div class="flex items-center space-x-2">
                                <i class="fas fa-clock text-gray-400"></i>
                                <span>最后更新: {{ new Date().toLocaleString('zh-CN') }}</span>
                            </div>
                            <div class="w-1 h-1 bg-gray-300 rounded-full"></div>
                            <div class="flex items-center space-x-2">
                                <i class="fas fa-history text-blue-500"></i>
                                <span class="text-blue-600 hover:text-blue-800 cursor-pointer transition-colors" @click="toggleEventHistory">事件历史</span>
                            </div>
                        </div>
                        <div class="text-xs text-gray-400">
                            数据每 30 秒自动刷新 • 服务由 ACGHX 提供
                        </div>
                    </div>
                </div>
            </div>

            <!-- 应用下载页面 -->
            <div v-if="currentView === 'apps'" class="animate-fade-in max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
                <!-- 页面标题 -->
                <div class="text-center mb-12">
                    <h1 class="text-4xl font-bold text-gray-900 mb-3 tracking-tight">应用下载中心</h1>
                    <p class="text-lg text-gray-600 max-w-2xl mx-auto">选择适合您设备的最佳客户端版本</p>
                </div>

                <!-- 加载状态 -->
                <div v-if="!apps" class="text-center py-16">
                    <div class="bg-white rounded-2xl shadow-sm border border-gray-100 p-12 max-w-md mx-auto">
                        <i class="fas fa-spinner fa-spin text-4xl text-blue-500 mb-4"></i>
                        <p class="text-gray-900 text-lg font-medium">正在加载应用列表...</p>
                    </div>
                </div>

                <!-- 无数据状态 -->
                <div v-else-if="apps.length === 0" class="text-center py-16">
                    <div class="bg-white rounded-2xl shadow-sm border border-gray-100 p-12 max-w-md mx-auto">
                        <i class="fas fa-exclamation-triangle text-4xl text-amber-500 mb-4"></i>
                        <p class="text-gray-900 text-lg font-medium">暂无应用可下载</p>
                    </div>
                </div>

                <!-- 应用列表 -->
                <div v-else class="space-y-8 mb-12">
                    <div v-for="app in apps" :key="app.name || 'unknown'" 
                         class="bg-white rounded-2xl shadow-sm border border-gray-100 overflow-hidden hover:shadow-md transition-shadow duration-300">
                        
                        <!-- 应用标题区域 -->
                        <div class="bg-gradient-to-r from-gray-50 to-gray-100 px-8 py-6 border-b border-gray-100">
                            <div class="flex items-center">
                                <div class="bg-white p-3 rounded-xl shadow-sm mr-4">
                                    <i :class="getAppIconClass(app.icon)" class="text-3xl text-blue-500"></i>
                                </div>
                                <div>
                                    <h2 class="text-2xl font-bold text-gray-900 tracking-tight">{{ app.name }}</h2>
                                    <p class="text-gray-600 mt-1">{{ app.description || '暂无描述' }}</p>
                                </div>
                            </div>
                        </div>
                        
                        <!-- 平台下载区域 -->
                        <div class="p-8" v-if="app.downloads && Object.keys(app.downloads).length > 0">
                            <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
                                <div v-for="(downloads, platform) in app.downloads" :key="platform" 
                                     class="space-y-4">
                                    
                                    <!-- 平台标题 -->
                                    <div class="flex items-center mb-6">
                                        <div class="bg-blue-50 p-2 rounded-lg mr-3">
                                            <i :class="getPlatformIcon(platform)" class="text-blue-500 text-lg"></i>
                                        </div>
                                        <h3 class="text-xl font-semibold text-gray-900">{{ platform }}</h3>
                                    </div>
                                    
                                    <!-- 下载项列表 -->
                                    <div class="space-y-3">
                                        <div v-for="(download, index) in downloads" :key="index" 
                                             class="group bg-gray-50 hover:bg-blue-50 rounded-xl p-5 transition-all duration-200 border border-transparent hover:border-blue-200">
                                            
                                            <div class="flex items-start justify-between">
                                                <div class="flex-1 min-w-0">
                                                    <div class="flex items-center mb-2">
                                                        <h4 class="font-semibold text-gray-900 text-lg">{{ download.name }}</h4>
                                                        <span v-if="download.name.includes('推荐')" 
                                                              class="ml-2 bg-blue-100 text-blue-800 text-xs font-medium px-2 py-1 rounded-full">
                                                            推荐
                                                        </span>
                                                    </div>
                                                    
                                                    <p class="text-gray-600 text-sm mb-4 leading-relaxed">{{ download.description || '暂无描述' }}</p>
                                                    
                                                    <div class="flex items-center space-x-4 text-sm text-gray-500">
                                                        <span class="flex items-center bg-white px-3 py-1.5 rounded-lg border">
                                                            <i class="fas fa-code-branch mr-2 text-blue-500"></i>
                                                            <span class="font-medium">版本 {{ download.version || 'N/A' }}</span>
                                                        </span>
                                                        <span class="flex items-center bg-white px-3 py-1.5 rounded-lg border">
                                                            <i class="fas fa-hdd mr-2 text-green-500"></i>
                                                            <span class="font-medium">{{ download.size || 'N/A' }}</span>
                                                        </span>
                                                    </div>
                                                </div>
                                                
                                                <!-- 下载按钮区域 -->
                                                <div class="ml-6 flex-shrink-0">
                                                    <a v-if="download.file && !download.file.includes('app_store')" 
                                                       :href="download.file"
                                                       class="inline-flex items-center bg-gradient-to-r from-blue-500 to-blue-600 hover:from-blue-600 hover:to-blue-700 text-white font-medium py-3 px-6 rounded-xl transition-all duration-300 shadow-lg hover:shadow-xl transform hover:-translate-y-0.5 group-hover:scale-105">
                                                        <i class="fas fa-download mr-2"></i>
                                                        下载
                                                    </a>
                                                    <button v-else-if="download.file && download.file.includes('app_store')"
                                                            @click="showAppStoreInfo(download.name)"
                                                            class="inline-flex items-center bg-gradient-to-r from-indigo-500 to-purple-600 hover:from-indigo-600 hover:to-purple-700 text-white font-medium py-3 px-6 rounded-xl transition-all duration-300 shadow-lg hover:shadow-xl transform hover:-translate-y-0.5 group-hover:scale-105">
                                                        <i class="fab fa-app-store mr-2"></i>
                                                        App Store
                                                    </button>
                                                    <div v-else class="text-center py-3 text-gray-400">
                                                        <i class="fas fa-exclamation-triangle mr-2"></i>
                                                        暂无下载链接
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                
                <!-- 页脚信息 -->
                <div class="bg-white rounded-2xl shadow-sm border border-gray-100 p-8 text-center">
                    <div class="space-y-4">
                        <div class="flex items-center justify-center space-x-6 text-sm text-gray-600">
                            <div class="flex items-center space-x-2">
                                <i class="fas fa-shield-alt text-green-500"></i>
                                <span>安全可靠的下载源</span>
                            </div>
                            <div class="w-1 h-1 bg-gray-300 rounded-full"></div>
                            <div class="flex items-center space-x-2">
                                <i class="fas fa-sync-alt text-blue-500"></i>
                                <span>定期更新最新版本</span>
                            </div>
                            <div class="w-1 h-1 bg-gray-300 rounded-full"></div>
                            <div class="flex items-center space-x-2">
                                <i class="fas fa-history text-blue-500"></i>
                                <span class="text-blue-600 hover:text-blue-800 cursor-pointer transition-colors" @click="toggleEventHistory">事件历史</span>
                            </div>
                        </div>
                        <div class="text-xs text-gray-400">
                            所有应用均经过安全检测 • 由 ACGHX 团队精选推荐
                        </div>
                    </div>
                </div>
            </div>
        </main>
        
        <!-- 事件历史模态框 -->
        <div v-if="showEventHistory" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4" @click.self="showEventHistory = false">
            <div class="bg-white rounded-2xl shadow-2xl max-w-4xl w-full max-h-[80vh] overflow-hidden">
                <!-- 标题栏 -->
                <div class="bg-gradient-to-r from-blue-500 to-blue-600 text-white p-6">
                    <div class="flex items-center justify-between">
                        <div>
                            <h3 class="text-2xl font-bold">事件历史</h3>
                            <p class="text-blue-100 mt-1">系统事件和服务器状态变化记录</p>
                        </div>
                        <button @click="showEventHistory = false" class="text-white hover:text-blue-200 p-2">
                            <i class="fas fa-times text-xl"></i>
                        </button>
                    </div>
                    
                    <!-- 统计信息 -->
                    <div v-if="eventStats" class="mt-4 grid grid-cols-2 md:grid-cols-4 gap-4">
                        <div :class="getFilterButtonClass('all')" @click="filterEvents('all')">
                            <div class="text-2xl font-bold">{{ eventStats.total || 0 }}</div>
                            <div class="text-sm text-blue-100">总事件</div>
                        </div>
                        <div :class="getFilterButtonClass('recent')" @click="filterEvents('recent')">
                            <div class="text-2xl font-bold">{{ eventStats.last_24h || 0 }}</div>
                            <div class="text-sm text-blue-100">24小时内</div>
                        </div>
                        <div :class="getFilterButtonClass('status_changes')" @click="filterEvents('status_changes')">
                            <div class="text-2xl font-bold">{{ eventStats.status_changes || 0 }}</div>
                            <div class="text-sm text-blue-100">状态变化</div>
                        </div>
                        <div :class="getFilterButtonClass('incidents')" @click="filterEvents('incidents')">
                            <div class="text-2xl font-bold">{{ eventStats.incidents || 0 }}</div>
                            <div class="text-sm text-blue-100">故障次数</div>
                        </div>
                    </div>
                </div>
                
                <!-- 事件列表 -->
                <div class="p-6 max-h-96 overflow-y-auto">
                    <!-- 筛选状态显示 -->
                    <div v-if="eventFilter && eventFilter !== 'all'" class="mb-4 flex items-center justify-between bg-blue-50 p-3 rounded-lg">
                        <div class="flex items-center space-x-2 text-blue-700">
                            <i class="fas fa-filter"></i>
                            <span class="text-sm font-medium">当前筛选: 
                                <span class="capitalize">
                                    {{ eventFilter === 'incidents' ? '故障事件' : 
                                       eventFilter === 'status_changes' ? '状态变化' : 
                                       eventFilter === 'recent' ? '24小时内' : eventFilter }}
                                </span>
                                (共 {{ filteredEvents.length }} 条记录)
                            </span>
                        </div>
                        <button @click="clearEventFilter()" class="text-blue-600 hover:text-blue-800 text-sm">
                            <i class="fas fa-times mr-1"></i>清除筛选
                        </button>
                    </div>
                    
                    <div v-if="loadingEvents" class="text-center py-8">
                        <i class="fas fa-spinner fa-spin text-2xl text-blue-500 mb-2"></i>
                        <p class="text-gray-600">加载事件历史...</p>
                    </div>
                    
                    <div v-else-if="(eventFilter ? filteredEvents : events).length === 0" class="text-center py-8">
                        <i class="fas fa-history text-4xl text-gray-300 mb-4"></i>
                        <p class="text-gray-500">
                            {{ eventFilter && eventFilter !== 'all' ? '无符合条件的事件记录' : '暂无事件记录' }}
                        </p>
                    </div>
                    
                    <div v-else class="space-y-3">
                        <div v-for="event in (eventFilter ? filteredEvents : events)" :key="event.id" 
                             class="bg-gray-50 rounded-lg p-4 hover:bg-gray-100 transition-colors">
                            <div class="flex items-start space-x-3">
                                <div class="flex-shrink-0 mt-1">
                                    <i :class="getEventTypeIcon(event.type)" class="text-blue-500"></i>
                                </div>
                                <div class="flex-1 min-w-0">
                                    <div class="flex items-center justify-between mb-1">
                                        <h4 class="font-medium text-gray-900">{{ event.server }}</h4>
                                        <div class="flex items-center space-x-3 text-sm text-gray-500">
                                            <span v-if="event.latency">{{ event.latency }}ms</span>
                                            <span>{{ formatEventTime(event.timestamp) }}</span>
                                        </div>
                                    </div>
                                    <div class="flex items-center space-x-2 mb-2">
                                        <span :class="getEventStatusColor(event.status)" class="text-sm font-medium capitalize">
                                            {{ event.status }}
                                        </span>
                                        <span class="text-xs text-gray-400">•</span>
                                        <span class="text-xs text-gray-500 uppercase">{{ event.type.replace('_', ' ') }}</span>
                                    </div>
                                    <p v-if="event.message" class="text-sm text-gray-600">{{ event.message }}</p>
                                    <div class="text-xs text-gray-400 mt-2">{{ event.date }}</div>
                                </div>
                            </div>
                        </div>
                    </div>
                    
                    <!-- 刷新按钮 -->
                    <div class="text-center mt-6">
                        <button @click="loadEventHistory()" 
                                :disabled="loadingEvents"
                                class="bg-blue-500 hover:bg-blue-600 disabled:bg-gray-400 text-white font-medium py-2 px-4 rounded-lg transition-colors">
                            <i class="fas fa-sync-alt mr-2" :class="loadingEvents ? 'fa-spin' : ''"></i>
                            刷新
                        </button>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <script>
        const { createApp } = Vue;
        
        createApp({
            data() {
                return {
                    currentView: 'home',
                    isAuthenticated: false,
                    password: '',
                    loading: false,
                    error: '',
                    mobileMenuOpen: false,
                    vpnConfigs: {},
                    apps: null,
                    authToken: '',
                    serverStatus: {},
                    isRefreshing: false,
                    testingServers: [],
                    showEventHistory: false,
                    events: [],
                    eventStats: {},
                    loadingEvents: false,
                    eventFilter: null, // 事件筛选: 'all', 'incidents', 'status_changes', 'recent'
                    filteredEvents: []
                }
            },
            
            mounted() {
                this.loadApps();
                // 检查本地存储的认证状态
                const savedToken = localStorage.getItem('vpn_auth_token');
                if (savedToken) {
                    this.authToken = savedToken;
                    this.isAuthenticated = true;
                    this.loadVpnConfigs();
                }
            },
            
            computed: {
                totalServers() {
                    let total = 0;
                    for (const region in this.vpnConfigs) {
                        total += this.vpnConfigs[region].length;
                    }
                    return total;
                },
                
                onlineCount() {
                    return Object.values(this.serverStatus).filter(status => status.status === 'online').length;
                },
                
                offlineCount() {
                    return Object.values(this.serverStatus).filter(status => status.status === 'offline').length;
                }
            },
            
            methods: {
                async authenticate() {
                    this.loading = true;
                    this.error = '';
                    
                    try {
                        const response = await axios.post('/api/auth', {
                            password: this.password
                        });
                        
                        if (response.data.success) {
                            this.isAuthenticated = true;
                            this.authToken = response.data.token;
                            localStorage.setItem('vpn_auth_token', this.authToken);
                            await this.loadVpnConfigs();
                        }
                    } catch (error) {
                        this.error = error.response?.data?.message || '认证失败，请重试';
                    } finally {
                        this.loading = false;
                    }
                },
                
                async loadVpnConfigs() {
                    try {
                        const response = await axios.get('/api/vpn-configs', {
                            headers: {
                                'Authorization': `Bearer ${this.authToken}`
                            }
                        });
                        this.vpnConfigs = response.data.configs;
                        // 自动开始监控
                        await this.refreshAllServers();
                    } catch (error) {
                        console.error('Failed to load VPN configs:', error);
                    }
                },
                
                async refreshAllServers() {
                    this.isRefreshing = true;
                    const previousStatus = { ...this.serverStatus };
                    
                    try {
                        const response = await axios.get('/api/ping-all');
                        const results = response.data.results;
                        
                        // 更新服务器状态
                        this.serverStatus = {};
                        results.forEach(result => {
                            const newStatus = {
                                status: result.status,
                                latency: result.latency,
                                timestamp: result.timestamp
                            };
                            
                            // 检查状态是否发生变化
                            const oldStatus = previousStatus[result.id];
                            if (oldStatus && oldStatus.status !== newStatus.status) {
                                // 状态发生变化，记录事件
                                this.logStatusChange(result, oldStatus.status, newStatus.status);
                            }
                            
                            this.serverStatus[result.id] = newStatus;
                        });
                        
                    } catch (error) {
                        console.error('Failed to refresh server status:', error);
                    } finally {
                        this.isRefreshing = false;
                    }
                },
                
                async logStatusChange(server, oldStatus, newStatus) {
                    try {
                        await axios.post('/api/events', {
                            type: 'status_change',
                            server: server.name,
                            status: newStatus,
                            message: `服务器状态从 ${oldStatus} 变为 ${newStatus}`,
                            latency: server.latency
                        });
                    } catch (error) {
                        console.error('Failed to log status change:', error);
                    }
                },
                
                async testServer(server) {
                    this.testingServers.push(server.id);
                    try {
                        const response = await axios.get(`/api/ping/${server.server}?port=${server.port}`);
                        
                        // 更新单个服务器状态
                        this.serverStatus[server.id] = {
                            status: response.data.status,
                            latency: response.data.latency,
                            timestamp: response.data.timestamp
                        };
                        
                    } catch (error) {
                        console.error('Failed to test server:', error);
                        this.serverStatus[server.id] = {
                            status: 'error',
                            latency: -1,
                            timestamp: Date.now() / 1000
                        };
                    } finally {
                        this.testingServers = this.testingServers.filter(id => id !== server.id);
                    }
                },
                
                getServerStatus(serverId) {
                    const status = this.serverStatus[serverId];
                    if (!status) return '未检测';
                    
                    switch (status.status) {
                        case 'online': return '在线';
                        case 'offline': return '离线';
                        case 'error': return '错误';
                        default: return '未知';
                    }
                },
                
                getServerCardClass(serverId) {
                    const status = this.serverStatus[serverId];
                    if (!status) return 'bg-card-bg backdrop-blur-sm border-border-light';
                    
                    switch (status.status) {
                        case 'online': return 'bg-success/20 backdrop-blur-sm border-success/50 shadow-lg shadow-success/20';
                        case 'offline': return 'bg-danger/20 backdrop-blur-sm border-danger/50 shadow-lg shadow-danger/20';
                        default: return 'bg-warning/20 backdrop-blur-sm border-warning/50 shadow-lg shadow-warning/20';
                    }
                },
                
                getStatusIconClass(serverId) {
                    const status = this.serverStatus[serverId];
                    if (!status) return 'bg-gray-400';
                    
                    switch (status.status) {
                        case 'online': return 'bg-success shadow-lg shadow-success/50';
                        case 'offline': return 'bg-danger shadow-lg shadow-danger/50';
                        default: return 'bg-warning shadow-lg shadow-warning/50';
                    }
                },
                
                getStatusTextClass(serverId) {
                    const status = this.serverStatus[serverId];
                    if (!status) return 'text-gray-300';
                    
                    switch (status.status) {
                        case 'online': return 'text-success';
                        case 'offline': return 'text-danger';
                        default: return 'text-warning';
                    }
                },
                
                getTypeTagClass(type) {
                    switch (type) {
                        case 'SS': return 'bg-primary text-white shadow-md';
                        case 'VLESS': return 'bg-secondary text-white shadow-md';
                        default: return 'bg-gray-500 text-white shadow-md';
                    }
                },
                
                getLatencyClass(latency) {
                    if (latency < 100) return 'text-success';
                    if (latency < 300) return 'text-warning';
                    return 'text-danger';
                },

                currentViewGo(view) {
                    this.currentView = view;
                },
                
                getRegionStatus(region) {
                    const servers = this.vpnConfigs[region] || [];
                    const online = servers.filter(server => this.serverStatus[server.id]?.status === 'online').length;
                    return `${online}/${servers.length} 在线`;
                },
                
                formatTimestamp(timestamp) {
                    return new Date(timestamp * 1000).toLocaleTimeString('zh-CN');
                },
                
                getStatusIconClass(serverId) {
                    const status = this.serverStatus[serverId];
                    if (!status) return 'bg-gray-400';
                    
                    switch (status.status) {
                        case 'online': return 'bg-green-500';
                        case 'offline': return 'bg-red-500';
                        default: return 'bg-yellow-500';
                    }
                },
                
                getStatusTextClassSimple(serverId) {
                    const status = this.serverStatus[serverId];
                    if (!status) return 'text-gray-500';
                    
                    switch (status.status) {
                        case 'online': return 'text-green-600';
                        case 'offline': return 'text-red-600';
                        default: return 'text-yellow-600';
                    }
                },
                
                getServerStatusSimple(serverId) {
                    const status = this.serverStatus[serverId];
                    if (!status) return 'Normal';
                    
                    switch (status.status) {
                        case 'online': return 'Normal';
                        case 'offline': return 'Offline';
                        default: return 'Warning';
                    }
                },
                
                getOverallStatusClass() {
                    const totalOnline = this.onlineCount;
                    const totalServers = this.totalServers;
                    
                    if (totalServers === 0) return 'status-warning';
                    if (totalOnline === totalServers) return 'status-operational';
                    if (totalOnline > totalServers * 0.8) return 'status-warning';
                    return 'status-error';
                },
                
                getOverallStatusText() {
                    const totalOnline = this.onlineCount;
                    const totalServers = this.totalServers;
                    
                    if (totalServers === 0) return 'No Systems';
                    if (totalOnline === totalServers) return 'All Systems Operational';
                    if (totalOnline > totalServers * 0.8) return 'Partial System Outage';
                    return 'Major System Outage';
                },
                
                getServerBorderClass(serverId) {
                    const status = this.serverStatus[serverId];
                    if (!status) return 'border-gray-300';
                    
                    switch (status.status) {
                        case 'online': return 'border-green-500';
                        case 'offline': return 'border-red-500';
                        default: return 'border-yellow-500';
                    }
                },
                
                getStatusBarClass(serverId) {
                    const status = this.serverStatus[serverId];
                    if (!status) return 'bg-gray-300';
                    
                    switch (status.status) {
                        case 'online': return 'progress-bar-online';
                        case 'offline': return 'progress-bar-offline';
                        default: return 'progress-bar-warning';
                    }
                },
                
                getStatusBarWidth(serverId) {
                    const status = this.serverStatus[serverId];
                    if (!status) return 'width: 0%';
                    
                    switch (status.status) {
                        case 'online': return 'width: 100%';
                        case 'offline': return 'width: 0%';
                        default: return 'width: 50%';
                    }
                },
                
                getUptimePercentage(serverId) {
                    const status = this.serverStatus[serverId];
                    if (!status) return '0%';
                    
                    switch (status.status) {
                        case 'online': return '99.9%';
                        case 'offline': return '0%';
                        default: return '50%';
                    }
                },
                
                filterEvents(filterType) {
                    this.eventFilter = filterType;
                    
                    switch (filterType) {
                        case 'incidents':
                            this.filteredEvents = this.events.filter(event => event.status === 'offline');
                            break;
                        case 'status_changes':
                            this.filteredEvents = this.events.filter(event => event.type === 'status_change');
                            break;
                        case 'recent':
                            const yesterday = Date.now() / 1000 - 24 * 3600;
                            this.filteredEvents = this.events.filter(event => event.timestamp > yesterday);
                            break;
                        case 'all':
                        default:
                            this.filteredEvents = [...this.events];
                            this.eventFilter = 'all';
                            break;
                    }
                },
                
                clearEventFilter() {
                    this.eventFilter = null;
                    this.filteredEvents = [...this.events];
                },
                
                getFilterButtonClass(filterType) {
                    const baseClass = 'bg-white/20 rounded-lg p-3 text-center transition-all duration-200 cursor-pointer hover:bg-white/30';
                    const activeClass = 'bg-white/40 ring-2 ring-white/50';
                    
                    return this.eventFilter === filterType ? `${baseClass} ${activeClass}` : baseClass;
                },
                
                async loadEventHistory() {
                    this.loadingEvents = true;
                    try {
                        const response = await axios.get('/api/events?limit=50');
                        this.events = response.data.events;
                        this.eventStats = response.data.stats;
                        // 初始化筛选结果
                        this.filteredEvents = [...this.events];
                    } catch (error) {
                        console.error('Failed to load event history:', error);
                    } finally {
                        this.loadingEvents = false;
                    }
                },
                
                toggleEventHistory() {
                    this.showEventHistory = !this.showEventHistory;
                    if (this.showEventHistory) {
                        if (this.events.length === 0) {
                            this.loadEventHistory();
                        } else {
                            // 重置筛选
                            this.clearEventFilter();
                        }
                    }
                },
                
                getEventTypeIcon(type) {
                    const icons = {
                        'status_change': 'fas fa-exchange-alt',
                        'ping_test': 'fas fa-heartbeat',
                        'system': 'fas fa-cog'
                    };
                    return icons[type] || 'fas fa-info-circle';
                },
                
                getEventStatusColor(status) {
                    const colors = {
                        'online': 'text-green-600',
                        'offline': 'text-red-600',
                        'warning': 'text-yellow-600',
                        'info': 'text-blue-600'
                    };
                    return colors[status] || 'text-gray-600';
                },
                
                formatEventTime(timestamp) {
                    const now = Date.now() / 1000;
                    const diff = now - timestamp;
                    
                    if (diff < 60) return '刚刚';
                    if (diff < 3600) return Math.floor(diff / 60) + ' 分钟前';
                    if (diff < 86400) return Math.floor(diff / 3600) + ' 小时前';
                    return Math.floor(diff / 86400) + ' 天前';
                },
                
                async loadApps() {
                    try {
                        console.log('正在加载应用列表...');
                        const response = await axios.get('/api/apps');
                        console.log('API响应:', response.data);
                        this.apps = response.data.apps || [];
                        console.log('应用列表已加载:', this.apps);
                    } catch (error) {
                        console.error('Failed to load apps:', error);
                        this.apps = []; // 确保apps初始化为空数组而不是undefined
                    }
                },
                
                getIconClass(icon) {
                    const icons = {
                        apple: 'fab fa-apple',
                        android: 'fab fa-android',
                        windows: 'fab fa-windows',
                        shield: 'fas fa-shield-alt'
                    };
                    return icons[icon] || 'fas fa-globe';
                },
                
                getAppIconClass(icon) {
                    const icons = {
                        shield: 'fas fa-shield-alt',
                        video: 'fab fa-tiktok',
                        rocket: 'fas fa-rocket'
                    };
                    return icons[icon] || 'fas fa-app';
                },
                
                getPlatformIcon(platform) {
                    const icons = {
                        'Android': 'fab fa-android',
                        'Windows': 'fab fa-windows',
                        'macOS': 'fab fa-apple',
                        'iOS': 'fab fa-app-store'
                    };
                    return icons[platform] || 'fas fa-desktop';
                },
                
                showAppStoreInfo(appName) {
                    const message = `${appName} 需要在 App Store 下载\n\n请注意：\n• 需要美区或其他地区 Apple ID\n• 部分应用可能需要付费\n• 建议先注册对应地区账号`;
                    alert(message);
                }
            }
        }).mount('#app');
    </script>
</body>
</html>