#!/bin/bash

# BearVPN 连接调试脚本
# 用于调试 macOS 平台下的节点连接超时问题

set -e

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查网络连接
check_network() {
    log_info "检查网络连接..."
    
    # 检查基本网络连接
    if ping -c 3 8.8.8.8 > /dev/null 2>&1; then
        log_success "基本网络连接正常"
    else
        log_error "基本网络连接失败"
        return 1
    fi
    
    # 检查 DNS 解析
    if nslookup google.com > /dev/null 2>&1; then
        log_success "DNS 解析正常"
    else
        log_error "DNS 解析失败"
        return 1
    fi
}

# 检查代理设置
check_proxy() {
    log_info "检查系统代理设置..."
    
    # 检查 HTTP 代理
    if [ -n "$http_proxy" ] || [ -n "$HTTP_PROXY" ]; then
        log_warning "检测到 HTTP 代理设置: $http_proxy$HTTP_PROXY"
    else
        log_info "未检测到 HTTP 代理设置"
    fi
    
    # 检查 HTTPS 代理
    if [ -n "$https_proxy" ] || [ -n "$HTTPS_PROXY" ]; then
        log_warning "检测到 HTTPS 代理设置: $https_proxy$HTTPS_PROXY"
    else
        log_info "未检测到 HTTPS 代理设置"
    fi
}

# 检查防火墙
check_firewall() {
    log_info "检查防火墙状态..."
    
    # 检查 macOS 防火墙
    local firewall_status=$(sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate 2>/dev/null || echo "unknown")
    log_info "防火墙状态: $firewall_status"
    
    if [ "$firewall_status" = "enabled" ]; then
        log_warning "防火墙已启用，可能影响连接"
    fi
}

# 测试常见端口连接
test_ports() {
    log_info "测试常见端口连接..."
    
    local ports=(80 443 8080 8443)
    local hosts=("google.com" "cloudflare.com" "github.com")
    
    for host in "${hosts[@]}"; do
        for port in "${ports[@]}"; do
            if timeout 5 bash -c "echo >/dev/tcp/$host/$port" 2>/dev/null; then
                log_success "$host:$port 连接正常"
            else
                log_warning "$host:$port 连接失败或超时"
            fi
        done
    done
}

# 检查 libcore 库
check_libcore() {
    log_info "检查 libcore 库..."
    
    if [ -f "libcore/bin/libcore.dylib" ]; then
        log_success "找到 libcore.dylib"
        
        # 检查库的架构
        local arch=$(file libcore/bin/libcore.dylib)
        log_info "库架构: $arch"
        
        # 检查库的依赖
        log_info "库依赖:"
        otool -L libcore/bin/libcore.dylib | head -10
    else
        log_error "未找到 libcore.dylib"
        return 1
    fi
}

# 检查应用配置
check_app_config() {
    log_info "检查应用配置..."
    
    # 检查当前域名配置
    if [ -f "lib/app/common/app_config.dart" ]; then
        log_info "检查域名配置..."
        grep -n "kr_baseDomains\|kr_currentDomain" lib/app/common/app_config.dart | head -5
    fi
    
    # 检查超时配置
    log_info "检查超时配置..."
    grep -n "kr_domainTimeout\|kr_totalTimeout" lib/app/common/app_config.dart | head -5
}

# 监控应用日志
monitor_logs() {
    log_info "开始监控应用日志..."
    log_info "请运行应用并尝试连接节点，然后按 Ctrl+C 停止监控"
    
    # 监控 Flutter 日志
    flutter logs --device-id=macos 2>/dev/null | grep -E "(ERROR|WARNING|INFO|超时|连接|节点|SingBox)" || true
}

# 主函数
main() {
    log_info "开始 BearVPN 连接调试..."
    log_info "=========================================="
    
    check_network
    check_proxy
    check_firewall
    test_ports
    check_libcore
    check_app_config
    
    log_info "=========================================="
    log_info "基础检查完成"
    log_info "=========================================="
    
    # 询问是否监控日志
    read -p "是否开始监控应用日志？(y/n): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        monitor_logs
    fi
    
    log_success "调试完成"
}

# 运行主函数
main "$@"
