#!/bin/bash

# Цвета для вывода
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'

echo "========================================="
echo "      NEXX SNI Автоматический тестер    "
echo "========================================="
echo ""

# Определяем страну по IP
SERVER_IP=$(curl -s ifconfig.me)
COUNTRY=$(curl -s "http://ip-api.com/json/$SERVER_IP" | grep -o '"countryCode":"[^"]*' | cut -d'"' -f4)

echo "📍 IP сервера: $SERVER_IP"
echo "🌍 Страна: $COUNTRY"
echo ""
echo "Тестирование популярных доменов..."
echo "-----------------------------------------"

# Списки доменов по регионам
DOMAINS_RU=(
    "yandex.ru"
    "mail.ru"
    "vk.com"
    "ok.ru"
    "rambler.ru"
    "dzen.ru"
    "rutube.ru"
    "gosuslugi.ru"
)

DOMAINS_EU=(
    "google.com"
    "cloudflare.com"
    "amazon.de"
    "microsoft.com"
    "apple.com"
    "github.com"
    "stackoverflow.com"
    "wikipedia.org"
)

DOMAINS_ASIA=(
    "baidu.com"
    "alibaba.com"
    "taobao.com"
    "qq.com"
    "jd.com"
)

# Выбираем список в зависимости от региона
if [[ "$COUNTRY" == "RU" ]] || [[ "$COUNTRY" == "BY" ]] || [[ "$COUNTRY" == "KZ" ]]; then
    echo "🔍 Регион: СНГ - тестируем российские домены"
    DOMAINS=("${DOMAINS_RU[@]}" "${DOMAINS_EU[@]}")
elif [[ "$COUNTRY" == "CN" ]] || [[ "$COUNTRY" == "HK" ]] || [[ "$COUNTRY" == "SG" ]]; then
    echo "🔍 Регион: Азия - тестируем азиатские домены"
    DOMAINS=("${DOMAINS_ASIA[@]}" "${DOMAINS_EU[@]}")
else
    echo "🔍 Регион: Международный - тестируем глобальные домены"
    DOMAINS=("${DOMAINS_EU[@]}")
fi

echo ""

# Массив для результатов
declare -A RESULTS

# Тестируем каждый домен
for domain in "${DOMAINS[@]}"; do
    # Делаем 3 попытки и берем среднее
    total_time=0
    failed=0
    
    for i in {1..3}; do
        result=$(curl -o /dev/null -s -w "%{time_connect}" --connect-timeout 2 "https://$domain" 2>/dev/null)
        if [ $? -eq 0 ]; then
            # Конвертируем в миллисекунды
            ms=$(echo "$result * 1000" | bc -l | cut -d'.' -f1)
            total_time=$((total_time + ms))
        else
            failed=$((failed + 1))
        fi
        sleep 0.1
    done
    
    if [ $failed -lt 3 ]; then
        avg_time=$((total_time / (3 - failed)))
        RESULTS[$domain]=$avg_time
    else
        RESULTS[$domain]=9999
    fi
done

# Сортируем результаты
echo "Результаты тестирования:"
echo ""
echo "Домен                     | Время (мс) | Статус"
echo "--------------------------|------------|--------"

# Создаем временный файл для сортировки
temp_file="/tmp/sni_results.txt"
> "$temp_file"

for domain in "${!RESULTS[@]}"; do
    echo "${RESULTS[$domain]}:$domain" >> "$temp_file"
done

# Сортируем и выводим
sort -n "$temp_file" | while IFS=':' read -r time domain; do
    if [ "$time" -eq 9999 ]; then
        printf "%-25s | %10s | ${RED}❌ Недоступен${NC}\n" "$domain" "N/A"
    elif [ "$time" -lt 30 ]; then
        printf "%-25s | %8d мс | ${GREEN}✅ Отлично${NC}\n" "$domain" "$time"
    elif [ "$time" -lt 50 ]; then
        printf "%-25s | %8d мс | ${GREEN}✅ Хорошо${NC}\n" "$domain" "$time"
    elif [ "$time" -lt 100 ]; then
        printf "%-25s | %8d мс | ${YELLOW}⚠️  Нормально${NC}\n" "$domain" "$time"
    else
        printf "%-25s | %8d мс | ${RED}❌ Плохо${NC}\n" "$domain" "$time"
    fi
done

# Получаем лучший домен
BEST_DOMAIN=$(sort -n "$temp_file" | head -1 | cut -d':' -f2)
BEST_TIME=$(sort -n "$temp_file" | head -1 | cut -d':' -f1)

echo ""
echo "========================================="
echo -e "${GREEN}🏆 РЕКОМЕНДУЕМЫЙ SNI: $BEST_DOMAIN${NC}"
echo -e "   Время отклика: ${BEST_TIME} мс"
echo "========================================="

# Проверяем текущий SNI
CURRENT_SNI=$(grep "server_name:" /opt/nexx-agent/config.yaml | awk '{print $2}')
echo ""
echo "📝 Текущий SNI в конфиге: $CURRENT_SNI"

# Предлагаем обновить
if [ "$CURRENT_SNI" != "$BEST_DOMAIN" ]; then
    echo ""
    echo -e "${YELLOW}Хотите обновить SNI на $BEST_DOMAIN? (y/n)${NC}"
    read -r answer
    
    if [ "$answer" = "y" ]; then
        # Обновляем config.yaml
        sed -i "s/server_name: .*/server_name: $BEST_DOMAIN/" /opt/nexx-agent/config.yaml
        
        # Обновляем Reality handshake server
        sed -i "/singbox:/,/nexios:/ {
            /handshake:/,/server_port:/ {
                s/server: .*/server: $BEST_DOMAIN/
            }
        }" /opt/nexx-agent/config.yaml
        
        echo -e "${GREEN}✅ Конфиг обновлен!${NC}"
        echo ""
        echo "Перезапускаем сервисы..."
        
        # Триггерим синхронизацию
        curl -X POST http://localhost:8080/api/sync/trigger 2>/dev/null
        sleep 2
        
        # Перезапускаем sing-box
        systemctl restart sing-box
        
        echo -e "${GREEN}✅ Сервисы перезапущены!${NC}"
        echo ""
        echo "Новый VLESS ключ будет с SNI=$BEST_DOMAIN"
    else
        echo "Конфиг не изменен."
    fi
else
    echo -e "${GREEN}✅ Текущий SNI уже оптимальный!${NC}"
fi

# Cleanup
rm -f "$temp_file"

echo ""
echo "========================================="
echo "Тест завершен!"
echo "========================================="
