#!/bin/sh
# DNS性能综合测试脚本 v5.2 - 国内全量增强版
# 安装依赖: opkg update && opkg install bind-dig

# ============================================================
# DNS服务器配置 - 国内DNS (26个) + 国外DNS (13个)
# ============================================================

# ---------- 阿里DNS / AliDNS (2个) ----------
# DoH: https://dns.alidns.com/dns-query | https://223.5.5.5/dns-query | https://223.6.6.6/dns-query
# DoT: dns.alidns.com | 223.5.5.5 | 223.6.6.6
# IPv6: 2400:3200::1 | 2400:3200:baba::1
# 注意: 免费版有限速 (单IP不超过20QPS)
ALI_DNS="223.5.5.5 223.6.6.6"

# ---------- 腾讯DNS / DNSPod (2个) ----------
# DoH: https://doh.pub/dns-query
# DoH(国密SM2): https://sm2.doh.pub/dns-query
# DoT: dot.pub
# IPv6: 2402:4e00:: | 2402:4e00:1::
# 注意: IP版DoH/DoT (1.12.12.12/120.53.53.53) 已停止服务
# 注意: 免费版限制单域名不超过20QPS
TENCENT_DNS="119.29.29.29 119.28.28.28"

# ---------- 百度DNS (1个) ----------
# IPv6: 已无法使用
BAIDU_DNS="180.76.76.76"

# ---------- 114 DNS 标准版 (2个) ----------
# 南京信风提供，仅支持IPv4
DNS_114="114.114.114.114 114.114.115.115"

# ---------- 114 DNS 安全版 (2个) - 拦截钓鱼/病毒/木马网站 ----------
DNS_114_SAFE="114.114.114.119 114.114.115.119"

# ---------- 114 DNS 家庭版 (2个) - 拦截色情网站 ----------
DNS_114_FAMILY="114.114.114.110 114.114.115.110"

# ---------- 字节跳动 TrafficRoute DNS / 火山引擎 (2个) ----------
# 仅支持IPv4
BYTEDANCE_DNS="180.184.1.1 180.184.2.2"

# ---------- CNNIC SDNS (2个) ----------
# 中国互联网络信息中心提供
# IPv6: 已无法使用
CNNIC_DNS="1.2.4.8 210.2.4.8"

# ---------- 北京互联网域名系统工程技术研究中心 / ZDNS (1个) ----------
ZDNS_DNS="1.8.8.8"

# ---------- OneDNS (2个) ----------
# 北京微步在线科技有限公司
# 注意: 纯净版/家庭版已下线，仅剩当前版本
# DoH: doh-pure.onedns.net/dns-query
# DoT: dot-pure.onedns.net
# IPv6: 2400:7fc0:849e:200::8 | 2404:c2c0:85d8:901::8
ONEDNS="52.80.66.66 117.50.22.22"

# ---------- 360安全DNS / DNS派 (4个) ----------
# DoH: https://doh.360.cn
# DoT: dot.360.cn
# 电信/移动/铁通线路
DNS_360_CT="101.226.4.6 218.30.118.6"
# 联通线路
DNS_360_CU="123.125.81.6 140.207.198.6"

# ---------- 牙木网络DNS (2个) ----------
YAMU_DNS="1.1.8.8 1.1.8.9"

# ---------- 联通DNS (1个) ----------
UNICOM_DNS="123.123.123.123"

# ---------- 教育网DNS (3个) ----------
EDU_DNS="159.226.8.6 202.112.80.106 101.6.6.6"

# ---------- 国外常用DNS (5个) ----------
FOREIGN_DNS="8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1 208.67.222.222"

# ---------- 国际专业DNS (8个) ----------
INTERNATIONAL_DNS="9.9.9.9 149.112.112.112 76.76.19.19 76.223.100.101 94.140.14.14 94.140.15.15 185.228.168.9 185.228.169.9"

# ============================================================
# DNS分组
# ============================================================
# 360安全DNS合集 (4个)
DNS_360="$DNS_360_CT $DNS_360_CU"

# 114全系列 (6个)
DNS_114_ALL="$DNS_114 $DNS_114_SAFE $DNS_114_FAMILY"

# 国内主流DNS (每家主力IP，共11个)
DOMESTIC_MAIN="$ALI_DNS $TENCENT_DNS $BAIDU_DNS $DNS_114 $BYTEDANCE_DNS"

# 国内扩展DNS (CNNIC/ZDNS/OneDNS/360/牙木/联通，共12个)
DOMESTIC_EXTRA="$CNNIC_DNS $ZDNS_DNS $ONEDNS $DNS_360 $YAMU_DNS $UNICOM_DNS"

# 所有国内DNS合集 (26个)
ALL_DOMESTIC_DNS="$ALI_DNS $TENCENT_DNS $BAIDU_DNS $DNS_114 $DNS_114_SAFE $DNS_114_FAMILY $BYTEDANCE_DNS $CNNIC_DNS $ZDNS_DNS $ONEDNS $DNS_360 $YAMU_DNS $UNICOM_DNS $EDU_DNS"

# 默认使用主流国内 + CNNIC + ZDNS + 牙木 + 联通 + 教育网 + 国外
DEFAULT_DNSSERVERS="$DOMESTIC_MAIN $CNNIC_DNS $ZDNS_DNS $YAMU_DNS $UNICOM_DNS $EDU_DNS $FOREIGN_DNS"
INTERNATIONAL_DNSSERVERS="$FOREIGN_DNS $INTERNATIONAL_DNS"

# ============================================================
# 测试域名配置
# ============================================================
# 国内常用网站 (5个)
DOMESTIC_DOMAINS="www.baidu.com www.qq.com www.taobao.com www.weibo.com www.bilibili.com"
# 被屏蔽的国外网站 (5个)
BLOCKED_DOMAINS="www.google.com www.youtube.com www.facebook.com www.twitter.com www.instagram.com"
# 成人内容网站 (5个) - 用于测试DNS过滤
ADULT_DOMAINS="pornhub.com xvideos.com xhamster.com redtube.com youporn.com"

# 国际媒体网站 (10个)
INTL_MEDIA_DOMAINS="www.netflix.com www.hulu.com www.disney.com www.amazon.com www.spotify.com www.twitch.tv www.reddit.com www.tiktok.com www.snapchat.com www.linkedin.com"

# 国际成人网站 (10个)
INTL_ADULT_DOMAINS="pornhub.com xvideos.com xhamster.com redtube.com youporn.com xnxx.com tube8.com spankbang.com beeg.com sex.com"

# 国际新闻网站 (10个)
INTL_NEWS_DOMAINS="www.cnn.com www.bbc.com www.reuters.com www.nytimes.com www.washingtonpost.com www.theguardian.com www.wsj.com www.bloomberg.com www.ft.com www.economist.com"

# 默认测试域名
DEFAULT_DOMAINS="$DOMESTIC_DOMAINS $BLOCKED_DOMAINS $ADULT_DOMAINS"
INTERNATIONAL_DOMAINS="$INTL_MEDIA_DOMAINS $INTL_ADULT_DOMAINS $INTL_NEWS_DOMAINS"

# ============================================================
# 颜色定义
# ============================================================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
GRAY='\033[0;90m'
NC='\033[0m'

# 打印带颜色的文本
print_color() {
    printf "${1}${2}${NC}\n"
}

# 用户交互配置
get_user_input() {
    print_color $CYAN "╔══════════════════════════════════════════════╗"
    print_color $CYAN "║          DNS性能测试工具 v5.2                ║"
    print_color $CYAN "║         国内全量增强版 - 详细报告            ║"
    print_color $CYAN "╚══════════════════════════════════════════════╝"
    echo
    
    print_color $YELLOW "📡 国内DNS服务器 (共$(echo $ALL_DOMESTIC_DNS | wc -w | tr -d ' ')个):"
    printf "${GREEN} 阿里DNS      (2):${NC} %s\n" "$ALI_DNS"
    printf "${GREEN} 腾讯DNSPod   (2):${NC} %s\n" "$TENCENT_DNS"
    printf "${GREEN} 百度DNS      (1):${NC} %s\n" "$BAIDU_DNS"
    printf "${GREEN} 114标准版    (2):${NC} %s\n" "$DNS_114"
    printf "${GREEN} 114安全版    (2):${NC} %s\n" "$DNS_114_SAFE"
    printf "${GREEN} 114家庭版    (2):${NC} %s\n" "$DNS_114_FAMILY"
    printf "${GREEN} 字节/火山    (2):${NC} %s\n" "$BYTEDANCE_DNS"
    printf "${GREEN} CNNIC SDNS   (2):${NC} %s\n" "$CNNIC_DNS"
    printf "${GREEN} ZDNS/BIDC    (1):${NC} %s\n" "$ZDNS_DNS"
    printf "${GREEN} OneDNS       (2):${NC} %s\n" "$ONEDNS"
    printf "${GREEN} 360DNS 电信  (2):${NC} %s\n" "$DNS_360_CT"
    printf "${GREEN} 360DNS 联通  (2):${NC} %s\n" "$DNS_360_CU"
    printf "${GREEN} 牙木DNS      (2):${NC} %s\n" "$YAMU_DNS"
    printf "${GREEN} 联通DNS      (1):${NC} %s\n" "$UNICOM_DNS"
    printf "${GREEN} 教育网DNS    (3):${NC} %s\n" "$EDU_DNS"
    echo
    print_color $YELLOW "🌐 国外DNS服务器 (共$(echo $FOREIGN_DNS $INTERNATIONAL_DNS | wc -w | tr -d ' ')个):"
    printf "${BLUE} 国外常用     (5):${NC} %s\n" "$FOREIGN_DNS"
    printf "${BLUE} 国际专业     (8):${NC} %s\n" "$INTERNATIONAL_DNS"
    echo
    print_color $YELLOW "🔗 测试域名:"
    printf "${BLUE} 国内域名:${NC} %s\n" "$DOMESTIC_DOMAINS"
    printf "${BLUE} 国外域名:${NC} %s\n" "$BLOCKED_DOMAINS"
    printf "${BLUE} 国际媒体:${NC} %s\n" "$INTL_MEDIA_DOMAINS"
    printf "${BLUE} 国际新闻:${NC} %s\n" "$INTL_NEWS_DOMAINS"
    printf "${GRAY} 成人内容:${NC} %s\n" "$INTL_ADULT_DOMAINS"
    echo
    
    printf "${YELLOW}选择测试模式:${NC}\n"
    printf "1) 完整测试 (默认) - 主流国内+扩展+教育网+国外 ($(echo $DEFAULT_DNSSERVERS | wc -w | tr -d ' ')个DNS)\n"
    printf "2) 快速测试 - 仅测试主流国内DNS ($(echo $DOMESTIC_MAIN | wc -w | tr -d ' ')个DNS)\n"
    printf "3) 国内全量 - 全部国内DNS ($(echo $ALL_DOMESTIC_DNS | wc -w | tr -d ' ')个DNS)\n"
    printf "4) 国际测试 - 国外+国际DNS ($(echo $INTERNATIONAL_DNSSERVERS | wc -w | tr -d ' ')个DNS)\n"
    printf "5) 全球测试 - 所有DNS+所有域名 ($(echo $ALL_DOMESTIC_DNS $FOREIGN_DNS $INTERNATIONAL_DNS | wc -w | tr -d ' ')个DNS)\n"
    printf "6) 自定义配置\n"
    printf "直接回车或输入数字: "
    
    read choice
    
    case "$choice" in
        "2")
            DNSSERVERS="$DOMESTIC_MAIN"
            DOMAINS="$DOMESTIC_DOMAINS"
            TEST_ROUNDS=2
            TEST_MODE="快速测试"
            print_color $GREEN "已选择: 快速测试模式"
            ;;
        "3")
            DNSSERVERS="$ALL_DOMESTIC_DNS"
            DOMAINS="$DOMESTIC_DOMAINS"
            TEST_ROUNDS=2
            TEST_MODE="国内全量测试"
            print_color $GREEN "已选择: 国内全量测试模式 ($(echo $ALL_DOMESTIC_DNS | wc -w | tr -d ' ')个国内DNS)"
            ;;
        "4")
            DNSSERVERS="$INTERNATIONAL_DNSSERVERS"
            DOMAINS="$INTERNATIONAL_DOMAINS"
            TEST_ROUNDS=3
            TEST_MODE="国际测试"
            print_color $GREEN "已选择: 国际测试模式"
            ;;
        "5")
            DNSSERVERS="$ALL_DOMESTIC_DNS $FOREIGN_DNS $INTERNATIONAL_DNS"
            DOMAINS="$DEFAULT_DOMAINS $INTERNATIONAL_DOMAINS"
            TEST_ROUNDS=3
            TEST_MODE="全球测试"
            print_color $GREEN "已选择: 全球测试模式"
            ;;
        "6")
            echo
            printf "DNS服务器选择:\n"
            printf " 1) 国内主流 - 阿里/腾讯/百度/114/字节 ($(echo $DOMESTIC_MAIN | wc -w | tr -d ' ')个)\n"
            printf " 2) 国内扩展 - CNNIC/ZDNS/OneDNS/360/牙木/联通 ($(echo $DOMESTIC_EXTRA | wc -w | tr -d ' ')个)\n"
            printf " 3) 114全系列 - 标准+安全+家庭 ($(echo $DNS_114_ALL | wc -w | tr -d ' ')个)\n"
            printf " 4) 360安全DNS ($(echo $DNS_360 | wc -w | tr -d ' ')个)\n"
            printf " 5) 教育网DNS ($(echo $EDU_DNS | wc -w | tr -d ' ')个)\n"
            printf " 6) 全部国内DNS ($(echo $ALL_DOMESTIC_DNS | wc -w | tr -d ' ')个)\n"
            printf " 7) 国外DNS ($(echo $FOREIGN_DNS | wc -w | tr -d ' ')个)\n"
            printf " 8) 国际DNS ($(echo $INTERNATIONAL_DNS | wc -w | tr -d ' ')个)\n"
            printf " 9) 全部DNS ($(echo $ALL_DOMESTIC_DNS $FOREIGN_DNS $INTERNATIONAL_DNS | wc -w | tr -d ' ')个)\n"
            printf "10) 自定义输入\n"
            printf "选择DNS类型 (1-10): "
            read dns_choice
            
            case "$dns_choice" in
                "1") DNSSERVERS="$DOMESTIC_MAIN" ;;
                "2") DNSSERVERS="$DOMESTIC_EXTRA" ;;
                "3") DNSSERVERS="$DNS_114_ALL" ;;
                "4") DNSSERVERS="$DNS_360" ;;
                "5") DNSSERVERS="$EDU_DNS" ;;
                "6") DNSSERVERS="$ALL_DOMESTIC_DNS" ;;
                "7") DNSSERVERS="$FOREIGN_DNS" ;;
                "8") DNSSERVERS="$INTERNATIONAL_DNS" ;;
                "9") DNSSERVERS="$ALL_DOMESTIC_DNS $FOREIGN_DNS $INTERNATIONAL_DNS" ;;
                "10") 
                    printf "输入DNS服务器 (空格分隔): "
                    read custom_dns
                    DNSSERVERS="$custom_dns"
                    ;;
                *) DNSSERVERS="$DEFAULT_DNSSERVERS" ;;
            esac
            
            echo
            printf "测试域名选择:\n"
            printf "1) 国内域名: %s\n" "$DOMESTIC_DOMAINS"
            printf "2) 国外域名: %s\n" "$BLOCKED_DOMAINS"
            printf "3) 国际媒体: %s\n" "$INTL_MEDIA_DOMAINS"
            printf "4) 国际新闻: %s\n" "$INTL_NEWS_DOMAINS"
            printf "5) 成人内容: %s\n" "$INTL_ADULT_DOMAINS"
            printf "6) 全部域名\n"
            printf "7) 自定义输入\n"
            printf "选择域名类型 (1-7): "
            read domain_choice
            
            case "$domain_choice" in
                "1") DOMAINS="$DOMESTIC_DOMAINS" ;;
                "2") DOMAINS="$BLOCKED_DOMAINS" ;;
                "3") DOMAINS="$INTL_MEDIA_DOMAINS" ;;
                "4") DOMAINS="$INTL_NEWS_DOMAINS" ;;
                "5") DOMAINS="$INTL_ADULT_DOMAINS" ;;
                "6") DOMAINS="$DEFAULT_DOMAINS $INTERNATIONAL_DOMAINS" ;;
                "7")
                    printf "输入测试域名 (空格分隔): "
                    read custom_domains
                    DOMAINS="$custom_domains"
                    ;;
                *) DOMAINS="$DEFAULT_DOMAINS" ;;
            esac
            
            printf "测试轮数 (1-5, 默认3): "
            read rounds
            if echo "$rounds" | grep -q '^[1-5]$'; then
                TEST_ROUNDS=$rounds
            else
                TEST_ROUNDS=3
            fi
            TEST_MODE="自定义配置"
            print_color $GREEN "已选择: 自定义配置"
            ;;
        *)
            DNSSERVERS="$DEFAULT_DNSSERVERS"
            DOMAINS="$DEFAULT_DOMAINS"
            TEST_ROUNDS=3
            TEST_MODE="完整测试"
            print_color $GREEN "已选择: 完整测试模式"
            ;;
    esac
    
    echo
    print_color $CYAN "开始 $TEST_MODE，请稍候..."
    echo
}

# DNS类型识别
get_dns_type() {
    dns=$1
    case "$dns" in
        # 国内DNS
        223.5.5.5|223.6.6.6) echo "阿里DNS" ;;
        119.29.29.29|119.28.28.28) echo "腾讯DNS" ;;
        180.76.76.76) echo "百度DNS" ;;
        114.114.114.114|114.114.115.115) echo "114DNS" ;;
        114.114.114.119|114.114.115.119) echo "114安全DNS" ;;
        114.114.114.110|114.114.115.110) echo "114家庭DNS" ;;
        180.184.1.1|180.184.2.2) echo "字节DNS" ;;
        1.2.4.8|210.2.4.8) echo "CNNIC DNS" ;;
        1.8.8.8) echo "ZDNS" ;;
        52.80.66.66|117.50.22.22) echo "OneDNS" ;;
        101.226.4.6|218.30.118.6) echo "360DNS电信" ;;
        123.125.81.6|140.207.198.6) echo "360DNS联通" ;;
        1.1.8.8|1.1.8.9) echo "牙木DNS" ;;
        123.123.123.123) echo "联通DNS" ;;
        159.226.8.6) echo "中科院DNS" ;;
        202.112.80.106) echo "教育网DNS" ;;
        101.6.6.6) echo "清华DNS" ;;
        # 国外DNS
        8.8.8.8|8.8.4.4) echo "Google DNS" ;;
        1.1.1.1|1.0.0.1) echo "Cloudflare" ;;
        208.67.222.222) echo "OpenDNS" ;;
        9.9.9.9|149.112.112.112) echo "Quad9 DNS" ;;
        76.76.19.19|76.223.100.101) echo "Control D" ;;
        94.140.14.14|94.140.15.15) echo "AdGuard DNS" ;;
        185.228.168.9|185.228.169.9) echo "CleanBrowse" ;;
        *) echo "其他DNS" ;;
    esac
}

# 域名类型识别
get_domain_type() {
    domain=$1
    case "$domain" in
        # 国内域名
        *.baidu.com|*.qq.com|*.taobao.com|*.weibo.com|*.bilibili.com) echo "国内" ;;
        # 被墙域名
        *.google.com|*.youtube.com|*.facebook.com|*.twitter.com|*.instagram.com) echo "被墙" ;;
        # 国际媒体
        *.netflix.com|*.hulu.com|*.disney.com|*.amazon.com|*.spotify.com|*.twitch.tv|*.reddit.com|*.tiktok.com|*.snapchat.com|*.linkedin.com) echo "国际媒体" ;;
        # 国际新闻
        *.cnn.com|*.bbc.com|*.reuters.com|*.nytimes.com|*.washingtonpost.com|*.theguardian.com|*.wsj.com|*.bloomberg.com|*.ft.com|*.economist.com) echo "国际新闻" ;;
        # 成人内容
        pornhub.com|xvideos.com|xhamster.com|redtube.com|youporn.com|xnxx.com|tube8.com|spankbang.com|beeg.com|sex.com) echo "成人" ;;
        *) echo "其他" ;;
    esac
}

# DNS ping延迟测试
test_dns_ping() {
    dns=$1
    # 使用ping命令测试DNS服务器延迟，发送3个包
    ping_result=$(ping -c 3 -W 2 "$dns" 2>/dev/null | grep "round-trip\|rtt" | tail -1)
    
    if [ -n "$ping_result" ]; then
        # 提取平均延迟时间
        avg_ping=$(echo "$ping_result" | awk -F'/' '{print $5}' | awk -F'.' '{print $1}')
        if [ -z "$avg_ping" ]; then
            # 尝试另一种格式提取
            avg_ping=$(echo "$ping_result" | awk '{for(i=1;i<=NF;i++){if($i~/avg/){split($(i+2),a,"/"); print int(a[1]); break}}}')
        fi
        
        if [ -n "$avg_ping" ] && [ "$avg_ping" -gt 0 ] 2>/dev/null; then
            echo "$avg_ping"
        else
            echo "999"
        fi
    else
        echo "999"
    fi
}

# DNS性能测试
test_dns() {
    dns=$1
    dns_type=$(get_dns_type "$dns")
    
    # 清理失败域名列表文件
    > "/tmp/dns_failed_${dns}.tmp"
    
    total_time=0
    success_count=0
    total_count=0
    domestic_success=0
    blocked_success=0
    adult_success=0
    intl_media_success=0
    intl_news_success=0
    domestic_total=0
    blocked_total=0
    adult_total=0
    intl_media_total=0
    intl_news_total=0
    
    printf "${BLUE}🔍 测试 %-15s [%s]${NC}\n" "$dns" "$dns_type"
    
    # 首先测试DNS服务器的ping延迟
    printf "   正在测试ping延迟..."
    ping_latency=$(test_dns_ping "$dns")
    if [ "$ping_latency" != "999" ]; then
        printf " ${GREEN}%dms${NC}\n" "$ping_latency"
    else
        printf " ${RED}超时${NC}\n"
    fi
    
    for round in $(seq 1 $TEST_ROUNDS); do
        if [ $TEST_ROUNDS -gt 1 ]; then
            printf "   第%d轮: " "$round"
        fi
        
        round_success=0
        round_total=0
        
        for domain in $DOMAINS; do
            domain_type=$(get_domain_type "$domain")
            total_count=$((total_count + 1))
            round_total=$((round_total + 1))
            
            case "$domain_type" in
                "国内") domestic_total=$((domestic_total + 1)) ;;
                "被墙") blocked_total=$((blocked_total + 1)) ;;
                "成人") adult_total=$((adult_total + 1)) ;;
                "国际媒体") intl_media_total=$((intl_media_total + 1)) ;;
                "国际新闻") intl_news_total=$((intl_news_total + 1)) ;;
            esac
            
            # DNS查询测试
            result=$(dig @$dns $domain +stats +tries=1 +time=3 2>/dev/null)
            qtime=$(echo "$result" | grep "Query time" | awk '{print $4}')
            
            if [ -n "$qtime" ] && [ "$qtime" -gt 0 ] 2>/dev/null; then
                total_time=$((total_time + qtime))
                success_count=$((success_count + 1))
                round_success=$((round_success + 1))
                
                case "$domain_type" in
                    "国内") domestic_success=$((domestic_success + 1)) ;;
                    "被墙") blocked_success=$((blocked_success + 1)) ;;
                    "成人") adult_success=$((adult_success + 1)) ;;
                    "国际媒体") intl_media_success=$((intl_media_success + 1)) ;;
                    "国际新闻") intl_news_success=$((intl_news_success + 1)) ;;
                esac
            else
                # 记录失败的域名和原因
                error_reason="超时"
                if echo "$result" | grep -q "SERVFAIL"; then
                    error_reason="服务器错误"
                elif echo "$result" | grep -q "NXDOMAIN"; then
                    error_reason="域名不存在"
                elif echo "$result" | grep -q "connection timed out"; then
                    error_reason="连接超时"
                fi
                echo "${domain}:${domain_type}:${error_reason}" >> "/tmp/dns_failed_${dns}.tmp"
            fi
        done
        
        if [ $TEST_ROUNDS -gt 1 ]; then
            printf "%d/%d " "$round_success" "$round_total"
            if [ $round -lt $TEST_ROUNDS ]; then
                printf "| "
            else
                printf "\n"
            fi
        fi
    done
    
    # 计算统计数据
    if [ $success_count -gt 0 ]; then
        avg_time=$((total_time / success_count))
        success_rate=$((success_count * 100 / total_count))
        
        # 分类解析率
        if [ $domestic_total -gt 0 ]; then
            domestic_rate=$((domestic_success * 100 / domestic_total))
        else
            domestic_rate=0
        fi
        
        if [ $blocked_total -gt 0 ]; then
            blocked_rate=$((blocked_success * 100 / blocked_total))
        else
            blocked_rate=0
        fi
        
        if [ $adult_total -gt 0 ]; then
            adult_rate=$((adult_success * 100 / adult_total))
        else  
            adult_rate=0
        fi
        
        if [ $intl_media_total -gt 0 ]; then
            intl_media_rate=$((intl_media_success * 100 / intl_media_total))
        else
            intl_media_rate=0
        fi
        
        if [ $intl_news_total -gt 0 ]; then
            intl_news_rate=$((intl_news_success * 100 / intl_news_total))
        else
            intl_news_rate=0
        fi
        
        # 综合评分计算
        if [ $avg_time -lt 30 ]; then
            speed_score=100
        elif [ $avg_time -lt 50 ]; then
            speed_score=$((100 - (avg_time - 30)))
        elif [ $avg_time -lt 100 ]; then
            speed_score=$((80 - (avg_time - 50) / 2))
        elif [ $avg_time -lt 300 ]; then
            speed_score=$((55 - (avg_time - 100) / 10))
        else
            temp_score=$((35 - (avg_time - 300) / 20))
            if [ $temp_score -lt 5 ]; then
                speed_score=5
            else
                speed_score=$temp_score
            fi
        fi
        
        if [ $speed_score -lt 0 ]; then
            speed_score=0
        fi
        
        # 综合评分: 成功率40% + 速度30% + 媒体/新闻解析30%
        media_news_avg=$(((intl_media_rate + intl_news_rate) / 2))
        if [ $domestic_total -gt 0 ]; then
            composite_score=$(((success_rate * 40 + speed_score * 30 + domestic_rate * 30) / 100))
        else
            composite_score=$(((success_rate * 40 + speed_score * 30 + media_news_avg * 30) / 100))
        fi
        
        # 输出统计结果
        printf "   ${GREEN}总成功率: %3d%% (%2d/%2d)${NC} | " "$success_rate" "$success_count" "$total_count"
        printf "${GREEN}平均延迟: %3dms${NC} | " "$avg_time"
        printf "${BLUE}Ping延迟: %3dms${NC}\n" "$ping_latency"
        
        # 显示分类解析率
        printf "   分类解析: "
        if [ $domestic_total -gt 0 ]; then
            printf "${GREEN}国内:%d%%${NC} " "$domestic_rate"
        fi
        if [ $blocked_total -gt 0 ]; then
            if [ $blocked_rate -gt 80 ]; then
                printf "${YELLOW}被墙:%d%%${NC} " "$blocked_rate"
            else
                printf "${RED}被墙:%d%%${NC} " "$blocked_rate"
            fi
        fi
        if [ $intl_media_total -gt 0 ]; then
            printf "${CYAN}媒体:%d%%${NC} " "$intl_media_rate"
        fi
        if [ $intl_news_total -gt 0 ]; then
            printf "${PURPLE}新闻:%d%%${NC} " "$intl_news_rate"
        fi
        if [ $adult_total -gt 0 ]; then
            if [ $adult_rate -lt 50 ]; then
                printf "${GREEN}过滤:%d%%${NC}" "$((100 - adult_rate))"
            else
                printf "${RED}成人:%d%%${NC}" "$adult_rate"
            fi
        fi
        printf "\n"
        
        printf "   ${PURPLE}综合评分: %d/100${NC}\n" "$composite_score"
        
        # 保存结果
        echo "$composite_score:$dns:$avg_time:$success_rate:$domestic_rate:$blocked_rate:$adult_rate:$dns_type:$ping_latency:$intl_media_rate:$intl_news_rate" >> /tmp/dns_results.tmp
    else
        printf "   ${RED}总成功率: 0%% (0/%d) | 平均延迟: 超时 | Ping延迟: %dms${NC}\n" "$total_count" "$ping_latency"
        printf "   ${RED}综合评分: 0/100${NC}\n"
        echo "0:$dns:9999:0:0:0:0:$dns_type:$ping_latency:0:0" >> /tmp/dns_results.tmp
    fi
    
    # 显示失败的域名详情
    if [ -s "/tmp/dns_failed_${dns}.tmp" ]; then
        failed_count=$(wc -l < "/tmp/dns_failed_${dns}.tmp")
        printf "   ${RED}失败域名 (%d个):${NC}\n" "$failed_count"
        
        # 按类型分组显示失败域名
        domestic_failed=""
        blocked_failed=""
        adult_failed=""
        media_failed=""
        news_failed=""
        other_failed=""
        
        while IFS=: read -r domain domain_type error_reason; do
            case "$domain_type" in
                "国内") 
                    if [ -z "$domestic_failed" ]; then
                        domestic_failed="$domain($error_reason)"
                    else
                        domestic_failed="$domestic_failed, $domain($error_reason)"
                    fi
                    ;;
                "被墙")
                    if [ -z "$blocked_failed" ]; then
                        blocked_failed="$domain($error_reason)"
                    else
                        blocked_failed="$blocked_failed, $domain($error_reason)"
                    fi
                    ;;
                "成人")
                    if [ -z "$adult_failed" ]; then
                        adult_failed="$domain($error_reason)"
                    else
                        adult_failed="$adult_failed, $domain($error_reason)"
                    fi
                    ;;
                "国际媒体")
                    if [ -z "$media_failed" ]; then
                        media_failed="$domain($error_reason)"
                    else
                        media_failed="$media_failed, $domain($error_reason)"
                    fi
                    ;;
                "国际新闻")
                    if [ -z "$news_failed" ]; then
                        news_failed="$domain($error_reason)"
                    else
                        news_failed="$news_failed, $domain($error_reason)"
                    fi
                    ;;
                *)
                    if [ -z "$other_failed" ]; then
                        other_failed="$domain($error_reason)"
                    else
                        other_failed="$other_failed, $domain($error_reason)"
                    fi
                    ;;
            esac
        done < "/tmp/dns_failed_${dns}.tmp"
        
        if [ -n "$domestic_failed" ]; then
            printf "     ${RED}国内: %s${NC}\n" "$domestic_failed"
        fi
        if [ -n "$blocked_failed" ]; then
            printf "     ${YELLOW}被墙: %s${NC}\n" "$blocked_failed"
        fi
        if [ -n "$media_failed" ]; then
            printf "     ${CYAN}媒体: %s${NC}\n" "$media_failed"
        fi
        if [ -n "$news_failed" ]; then
            printf "     ${PURPLE}新闻: %s${NC}\n" "$news_failed"
        fi
        if [ -n "$adult_failed" ]; then
            printf "     ${GRAY}成人: %s${NC}\n" "$adult_failed"
        fi
        if [ -n "$other_failed" ]; then
            printf "     ${BLUE}其他: %s${NC}\n" "$other_failed"
        fi
    fi
    
    echo
    # 清理临时文件
    rm -f "/tmp/dns_failed_${dns}.tmp"
}

# 显示最终排名和推荐
show_results() {
    print_color $CYAN "╔══════════════════════════════════════════════╗"
    print_color $CYAN "║             DNS性能排名报告                 ║"
    print_color $CYAN "╚══════════════════════════════════════════════╝"
    echo
    
    rank=1
    best_dns=""
    best_domestic=""
    best_unblocked=""
    best_international=""
    
    sort -rn -t: -k1 /tmp/dns_results.tmp | while IFS=: read -r score dns avg_time success_rate domestic_rate blocked_rate adult_rate dns_type ping_latency intl_media_rate intl_news_rate; do
        case $rank in
            1)
                printf "${GREEN}🥇 第%d名: %-15s [%s]${NC}\n" "$rank" "$dns" "$dns_type"
                printf "${GREEN}   综合评分: %d/100 | DNS延迟: %dms | Ping延迟: %dms | 成功率: %d%%${NC}\n" "$score" "$avg_time" "$ping_latency" "$success_rate"
                best_dns=$dns
                ;;
            2)
                printf "${YELLOW}🥈 第%d名: %-15s [%s]${NC}\n" "$rank" "$dns" "$dns_type"
                printf "${YELLOW}   综合评分: %d/100 | DNS延迟: %dms | Ping延迟: %dms | 成功率: %d%%${NC}\n" "$score" "$avg_time" "$ping_latency" "$success_rate"
                ;;
            3)
                printf "${PURPLE}🥉 第%d名: %-15s [%s]${NC}\n" "$rank" "$dns" "$dns_type"
                printf "${PURPLE}   综合评分: %d/100 | DNS延迟: %dms | Ping延迟: %dms | 成功率: %d%%${NC}\n" "$score" "$avg_time" "$ping_latency" "$success_rate"
                ;;
            *)
                printf "%2d. %-15s [%-12s] 评分:%3d DNS:%3dms Ping:%3dms 成功率:%3d%%\n" "$rank" "$dns" "$dns_type" "$score" "$avg_time" "$ping_latency" "$success_rate"
                ;;
        esac
        
        rank=$((rank + 1))
    done
    
    # 读取最佳DNS推荐
    best_dns=$(sort -rn -t: -k1 /tmp/dns_results.tmp | head -1 | cut -d: -f2)
    best_domestic=$(sort -rn -t: -k1 /tmp/dns_results.tmp | grep -E "(阿里|腾讯|百度|114|字节|CNNIC|ZDNS|OneDNS|360DNS|牙木|联通DNS|中科院|教育|清华)" | head -1 | cut -d: -f2)
    best_unblocked=$(sort -rn -t: -k1 /tmp/dns_results.tmp | awk -F: '$6 > 80' | head -1 | cut -d: -f2)
    best_international=$(sort -rn -t: -k1 /tmp/dns_results.tmp | grep -E "(Google|Cloudflare|Quad9|OpenDNS|AdGuard|CleanBrowse|Control)" | head -1 | cut -d: -f2)
    
    echo
    print_color $CYAN "╔══════════════════════════════════════════════╗"
    print_color $CYAN "║                使用建议                     ║"
    print_color $CYAN "╚══════════════════════════════════════════════╝"
    
    if [ -n "$best_dns" ]; then
        printf "${GREEN}🌟 综合最佳: %s${NC}\n" "$best_dns"
    fi
    
    if [ -n "$best_domestic" ]; then
        printf "${BLUE}🏠 国内推荐: %s${NC}\n" "$best_domestic"
    fi
    
    if [ -n "$best_unblocked" ]; then
        printf "${YELLOW}🌍 翻墙推荐: %s${NC}\n" "$best_unblocked"
    fi
    
    if [ -n "$best_international" ]; then
        printf "${PURPLE}🌐 国际推荐: %s${NC}\n" "$best_international"
    fi
    
    # 显示详细统计
    echo
    print_color $CYAN "╔══════════════════════════════════════════════╗"
    print_color $CYAN "║              详细性能统计                   ║"
    print_color $CYAN "╚══════════════════════════════════════════════╝"
    
    printf "%-15s %-12s %5s %5s %5s %5s %5s %5s %5s\n" "DNS服务器" "类型" "评分" "延迟" "成功" "国内" "被墙" "媒体" "新闻"
    printf "%-15s %-12s %5s %5s %5s %5s %5s %5s %5s\n" "===============" "============" "=====" "=====" "=====" "=====" "=====" "=====" "====="
    
    sort -rn -t: -k1 /tmp/dns_results.tmp | while IFS=: read -r score dns avg_time success_rate domestic_rate blocked_rate adult_rate dns_type ping_latency intl_media_rate intl_news_rate; do
        printf "%-15s %-12s %5d %4dms %4d%% %4d%% %4d%% %4d%% %4d%%\n" \
            "$dns" "$dns_type" "$score" "$avg_time" "$success_rate" \
            "$domestic_rate" "$blocked_rate" "$intl_media_rate" "$intl_news_rate"
    done
    
    echo
    print_color $GRAY "测试完成! 结果仅供参考，实际效果可能因网络环境而异。"
    print_color $GRAY "DNS延迟: 域名解析时间 | Ping延迟: 到DNS服务器的网络延迟"
    print_color $GRAY "国内: 国内网站解析率 | 被墙: 被屏蔽网站解析率"
    print_color $GRAY "媒体: 国际媒体网站解析率 | 新闻: 国际新闻网站解析率"
    
    # 清理临时文件
    rm -f /tmp/dns_results.tmp
}

# 主程序
main() {
    # 检查dig命令
    if ! command -v dig >/dev/null 2>&1; then
        print_color $RED "❌ 错误: 未找到dig命令"
        print_color $YELLOW "请先安装: opkg update && opkg install bind-dig"
        exit 1
    fi
    
    # 检查ping命令
    if ! command -v ping >/dev/null 2>&1; then
        print_color $YELLOW "⚠️  警告: 未找到ping命令，将跳过ping延迟测试"
    fi
    
    # 用户交互配置
    get_user_input
    
    # 初始化结果文件
    > /tmp/dns_results.tmp
    
    # 显示测试配置
    dns_count=$(echo $DNSSERVERS | wc -w)
    domain_count=$(echo $DOMAINS | wc -w)
    total_tests=$((dns_count * domain_count * TEST_ROUNDS))
    
    print_color $CYAN "测试配置:"
    printf "${BLUE}DNS服务器: %d个${NC} | " "$dns_count"
    printf "${BLUE}测试域名: %d个${NC} | " "$domain_count"
    printf "${BLUE}测试轮数: %d轮${NC}\n" "$TEST_ROUNDS"
    printf "${YELLOW}预计总测试次数: %d次${NC}\n" "$total_tests"
    echo
    
    # 开始测试
    print_color $CYAN "正在测试DNS服务器性能..."
    echo
    
    for dns in $DNSSERVERS; do
        test_dns "$dns"
    done
    
    # 显示结果
    show_results
}

# 启动程序
main "$@"

