#!/bin/bash

# ============================================
# VDS Benchmark Script для Telegram бота
# ============================================

# ========== НАСТРОЙКИ (ОТРЕДАКТИРУЙТЕ ПРИ НЕОБХОДИМОСТИ) ==========
# Оставьте пустыми, если не хотите тестировать отправку сообщений
BOT_TOKEN="8272869570:AAFvAfr2RRXSY_OI18pGLKGsEy2Xz6Wdy0Y"   # Токен вашего бота
CHAT_ID="-1003429835189"                                      # ID чата/группы/пользователя
# ==================================================================

# Цвета
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'

# Массив для хранения результатов
RESULTS=()

# Функции
print_header() {
    echo -e "\n${BLUE}════════════════════════════════════════════════════════${NC}"
    echo -e "${GREEN}$1${NC}"
    echo -e "${BLUE}════════════════════════════════════════════════════════${NC}\n"
}

add_result() {
    RESULTS+=("$1")
}

print_final_results() {
    echo -e "\n${CYAN}"
    echo "╔══════════════════════════════════════════════════════════════════════════════╗"
    echo "║                              РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ                          ║"
    echo "╚══════════════════════════════════════════════════════════════════════════════╝"
    echo -e "${NC}\n"
    
    for line in "${RESULTS[@]}"; do
        echo -e "$line"
    done
    
    echo -e "\n${CYAN}════════════════════════════════════════════════════════════════════════════════${NC}"
}

# ============================================
# 0. УСТАНОВКА СОФТА
# ============================================
print_header "УСТАНОВКА НЕОБХОДИМОГО ПО"

echo "Обновление пакетов..."
apt update -qq 2>/dev/null

install_pkg() {
    if ! command -v $1 &> /dev/null; then
        echo "  Установка $1..."
        apt install -y $2 2>/dev/null
    fi
}

install_pkg "curl" "curl"
install_pkg "ping" "iputils-ping"
install_pkg "dig" "dnsutils"
install_pkg "nc" "netcat-openbsd"
install_pkg "mtr" "mtr"
install_pkg "fio" "fio"
install_pkg "sysbench" "sysbench"
install_pkg "speedtest-cli" "speedtest-cli"
install_pkg "bc" "bc"

if ! command -v tcping &> /dev/null; then
    echo "  Установка tcping..."
    snap install tcping > /dev/null 2>&1
fi

echo -e "${GREEN}✅ Установка завершена${NC}"

# ============================================
# СБОР ДАННЫХ
# ============================================

# 1. Система
HOSTNAME=$(hostname)
OS=$(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)
KERNEL=$(uname -r)
UPTIME=$(uptime -p)

# 2. CPU
CPU_MODEL=$(lscpu | grep "Model name" | head -1 | cut -d':' -f2 | xargs)
CPU_CORES=$(nproc)

# 3. RAM
RAM_TOTAL=$(free -h | grep Mem | awk '{print $2}')
RAM_USED=$(free -h | grep Mem | awk '{print $3}')
RAM_FREE=$(free -h | grep Mem | awk '{print $4}')

# 4. Диск
DISK_ROTA=$(lsblk -d -o rota 2>/dev/null | grep -v "ROTA" | head -1 | xargs)
DISK_SIZE=$(lsblk -d -o size 2>/dev/null | grep -v "SIZE" | head -1 | xargs)
DD_SPEED=$(dd if=/dev/zero of=/tmp/test bs=1M count=500 conv=fdatasync 2>&1 | tail -1 | grep -oP '\d+[,.]?\d*\s*(GB|MB)/s' | head -1)
rm -f /tmp/test

# 5. FIO тест
FIO_READ=$(fio --randrepeat=1 --ioengine=libaio --direct=1 --name=test --bs=4k --iodepth=64 --size=512M --readwrite=randrw --rwmixread=75 --output-format=terse 2>/dev/null | awk -F';' '{print $8}')
rm -f test.*

# 6. Пинг до Telegram
PING_AVG=$(ping -c 5 api.telegram.org 2>/dev/null | grep -oP 'avg = \K[0-9.]+')
PING_MIN=$(ping -c 5 api.telegram.org 2>/dev/null | grep -oP 'min/avg/max/\S+ = \K[0-9.]+')
PING_MAX=$(ping -c 5 api.telegram.org 2>/dev/null | grep -oP 'min/avg/max/\S+ = [0-9.]+/[0-9.]+/[0-9.]+' | grep -oP '[0-9.]+$')

# 7. MTR потери
LOSS=$(mtr -r -c 20 api.telegram.org 2>/dev/null | grep "api.telegram.org" | grep -oP '\d+\.\d+%' | head -1)
if [ -z "$LOSS" ]; then LOSS="0.0%"; fi

# 8. Время ответа API
TLS_TIME=$(curl -w "%{time_appconnect}" -o /dev/null -s https://api.telegram.org)
TOTAL_TIME=$(curl -o /dev/null -s -w "%{time_total}" https://api.telegram.org)

# 9. Тест отправки сообщения (используем переменные из начала скрипта)
if [ -n "$BOT_TOKEN" ] && [ -n "$CHAT_ID" ]; then
    SEND_TIMES=()
    echo "  Тестирование отправки сообщений..."
    for i in {1..3}; do
        t=$(curl -s -o /dev/null -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
            -d "chat_id=${CHAT_ID}" \
            -d "text=Benchmark test $i" \
            -w "%{time_total}")
        SEND_TIMES+=($t)
        sleep 0.5
    done
    SUM=0
    for t in "${SEND_TIMES[@]}"; do SUM=$(echo "$SUM + $t" | bc); done
    SEND_AVG=$(echo "scale=3; $SUM / 3" | bc)
fi

# 10. Стабильность (10 запросов)
SLOW_COUNT=0
TIMEOUT_COUNT=0
for i in {1..10}; do
    t=$(curl -o /dev/null -s -w "%{time_total}" https://api.telegram.org 2>/dev/null)
    if [ -z "$t" ]; then
        ((TIMEOUT_COUNT++))
    elif (( $(echo "$t > 1" | bc -l 2>/dev/null) )); then
        ((SLOW_COUNT++))
    fi
    sleep 0.5
done

# 11. CPU тест
CPU_EVENTS=$(sysbench cpu --cpu-max-prime=10000 run 2>/dev/null | grep "events per second" | awk '{print $4}')

# 12. Скорость интернета
INTERNET_SPEED=$(curl -s https://speed.cloudflare.com/__down?bytes=50000000 -o /dev/null -w "%{speed_download}" 2>/dev/null)
if [ -n "$INTERNET_SPEED" ]; then
    INTERNET_SPEED_MB=$(echo "scale=1; $INTERNET_SPEED / 1048576" | bc)
fi

# 13. DNS и порт
DNS_IP=$(dig api.telegram.org +short 2>/dev/null | head -1)
PORT_CHECK=$(nc -zv api.telegram.org 443 2>&1 | grep -q "succeeded" && echo "OK" || echo "FAIL")

# ============================================
# ВЫВОД РЕЗУЛЬТАТОВ
# ============================================

clear

echo -e "${CYAN}"
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
echo "║                         VDS BENCHMARK FOR TELEGRAM BOT                        ║"
echo "║                         $(date '+%Y-%m-%d %H:%M:%S')                            ║"
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
echo -e "${NC}\n"

# Система
add_result "${CYAN}════════════════════════════════════════════════════════════════════════════════${NC}"
add_result "${GREEN}📊 СИСТЕМА${NC}"
add_result "  Хост: $HOSTNAME"
add_result "  ОС: $OS"
add_result "  Ядро: $KERNEL"
add_result "  Uptime: $UPTIME"
add_result ""

# CPU
add_result "${GREEN}💻 ПРОЦЕССОР${NC}"
add_result "  Модель: $CPU_MODEL"
add_result "  Ядер: $CPU_CORES"
if [ -n "$CPU_EVENTS" ]; then
    if (( $(echo "$CPU_EVENTS > 2000" | bc -l 2>/dev/null) )); then
        add_result "  ${GREEN}✅ Тест CPU: ${CPU_EVENTS} событий/сек (отлично)${NC}"
    elif (( $(echo "$CPU_EVENTS > 1000" | bc -l 2>/dev/null) )); then
        add_result "  ${YELLOW}👍 Тест CPU: ${CPU_EVENTS} событий/сек (хорошо)${NC}"
    else
        add_result "  ${RED}❌ Тест CPU: ${CPU_EVENTS} событий/сек (слабо)${NC}"
    fi
fi
add_result ""

# RAM
add_result "${GREEN}💾 ОПЕРАТИВНАЯ ПАМЯТЬ${NC}"
add_result "  Всего: $RAM_TOTAL | Использовано: $RAM_USED | Свободно: $RAM_FREE"
add_result ""

# Диск
add_result "${GREEN}💿 ДИСКОВАЯ ПОДСИСТЕМА${NC}"
add_result "  Размер: $DISK_SIZE"
if [ "$DISK_ROTA" = "0" ]; then
    add_result "  ${GREEN}✅ Тип: SSD/NVMe${NC}"
elif [ "$DISK_ROTA" = "1" ]; then
    add_result "  ${RED}❌ Тип: HDD (не рекомендуется для бота!)${NC}"
else
    add_result "  Тип: не определен"
fi
add_result "  Скорость (dd): $DD_SPEED"

if [ -n "$FIO_READ" ]; then
    if (( $(echo "$FIO_READ > 50000" | bc -l 2>/dev/null) )); then
        add_result "  ${GREEN}✅ Случайный доступ (IOPS): $FIO_READ (отлично)${NC}"
    elif (( $(echo "$FIO_READ > 10000" | bc -l 2>/dev/null) )); then
        add_result "  ${YELLOW}👍 Случайный доступ (IOPS): $FIO_READ (хорошо)${NC}"
    else
        add_result "  ${RED}❌ Случайный доступ (IOPS): $FIO_READ (медленно)${NC}"
    fi
fi
add_result ""

# Сеть до Telegram
add_result "${GREEN}🌐 СЕТЬ ДО TELEGRAM API${NC}"
if [ -n "$PING_AVG" ]; then
    if (( $(echo "$PING_AVG < 30" | bc -l 2>/dev/null) )); then
        add_result "  ${GREEN}✅ ICMP пинг: ${PING_AVG}ms (мин: ${PING_MIN}ms, макс: ${PING_MAX}ms)${NC}"
    elif (( $(echo "$PING_AVG < 80" | bc -l 2>/dev/null) )); then
        add_result "  ${YELLOW}👍 ICMP пинг: ${PING_AVG}ms (мин: ${PING_MIN}ms, макс: ${PING_MAX}ms)${NC}"
    else
        add_result "  ${RED}❌ ICMP пинг: ${PING_AVG}ms (слишком высокий)${NC}"
    fi
fi

if [ "$LOSS" = "0.0%" ]; then
    add_result "  ${GREEN}✅ Потери пакетов: $LOSS${NC}"
else
    add_result "  ${RED}❌ Потери пакетов: $LOSS (проблема!)${NC}"
fi

add_result "  TLS Handshake: ${TLS_TIME}s"

if [ -n "$TOTAL_TIME" ]; then
    if (( $(echo "$TOTAL_TIME < 0.1" | bc -l 2>/dev/null) )); then
        add_result "  ${GREEN}✅ Ответ API: ${TOTAL_TIME}s (отлично)${NC}"
    elif (( $(echo "$TOTAL_TIME < 0.3" | bc -l 2>/dev/null) )); then
        add_result "  ${YELLOW}👍 Ответ API: ${TOTAL_TIME}s (хорошо)${NC}"
    else
        add_result "  ${RED}❌ Ответ API: ${TOTAL_TIME}s (медленно)${NC}"
    fi
fi

add_result "  DNS резолвинг: $DNS_IP"

if [ "$PORT_CHECK" = "OK" ]; then
    add_result "  ${GREEN}✅ Порт 443: открыт${NC}"
else
    add_result "  ${RED}❌ Порт 443: недоступен${NC}"
fi
add_result ""

# Отправка сообщений (если заданы переменные)
if [ -n "$SEND_AVG" ]; then
    add_result "${GREEN}📨 ОТПРАВКА СООБЩЕНИЙ${NC}"
    add_result "  Токен бота: ${BOT_TOKEN:0:20}..."
    add_result "  Chat ID: $CHAT_ID"
    if (( $(echo "$SEND_AVG < 0.2" | bc -l 2>/dev/null) )); then
        add_result "  ${GREEN}✅ Среднее время: ${SEND_AVG}s (отлично)${NC}"
    elif (( $(echo "$SEND_AVG < 0.5" | bc -l 2>/dev/null) )); then
        add_result "  ${YELLOW}👍 Среднее время: ${SEND_AVG}s (хорошо)${NC}"
    else
        add_result "  ${RED}❌ Среднее время: ${SEND_AVG}s (медленно)${NC}"
    fi
    add_result ""
else
    add_result "${YELLOW}📨 ОТПРАВКА СООБЩЕНИЙ (пропущено)${NC}"
    add_result "  Для теста отправки укажите BOT_TOKEN и CHAT_ID в начале скрипта"
    add_result ""
fi

# Стабильность
add_result "${GREEN}📈 СТАБИЛЬНОСТЬ (10 запросов)${NC}"
if [ $TIMEOUT_COUNT -eq 0 ] && [ $SLOW_COUNT -eq 0 ]; then
    add_result "  ${GREEN}✅ Нет таймаутов, нет медленных запросов${NC}"
else
    [ $TIMEOUT_COUNT -gt 0 ] && add_result "  ${RED}❌ Таймаутов: $TIMEOUT_COUNT${NC}"
    [ $SLOW_COUNT -gt 0 ] && add_result "  ${YELLOW}⚠️ Медленных запросов (>1с): $SLOW_COUNT${NC}"
fi
add_result ""

# Скорость интернета
if [ -n "$INTERNET_SPEED_MB" ]; then
    add_result "${GREEN}🚀 СКОРОСТЬ ИНТЕРНЕТА${NC}"
    if (( $(echo "$INTERNET_SPEED_MB > 100" | bc -l 2>/dev/null) )); then
        add_result "  ${GREEN}✅ Download: ${INTERNET_SPEED_MB} MB/s (отлично)${NC}"
    elif (( $(echo "$INTERNET_SPEED_MB > 50" | bc -l 2>/dev/null) )); then
        add_result "  ${YELLOW}👍 Download: ${INTERNET_SPEED_MB} MB/s (хорошо)${NC}"
    else
        add_result "  ${YELLOW}⚠️ Download: ${INTERNET_SPEED_MB} MB/s${NC}"
    fi
    add_result ""
fi

# ИТОГОВАЯ ОЦЕНКА
add_result "${CYAN}════════════════════════════════════════════════════════════════════════════════${NC}"
add_result "${GREEN}🎯 ИТОГОВАЯ ОЦЕНКА${NC}"

SCORE=0
MAX_SCORE=10
COMMENTS=()

# Диск
if [ "$DISK_ROTA" = "0" ]; then
    SCORE=$((SCORE + 2))
else
    COMMENTS+=("  - HDD диск, замените на SSD/NVMe")
fi

# Пинг
if [ -n "$PING_AVG" ]; then
    if (( $(echo "$PING_AVG < 30" | bc -l 2>/dev/null) )); then
        SCORE=$((SCORE + 2))
    elif (( $(echo "$PING_AVG < 80" | bc -l 2>/dev/null) )); then
        SCORE=$((SCORE + 1))
    else
        COMMENTS+=("  - Высокий пинг (${PING_AVG}ms), выберите сервер в Европе")
    fi
fi

# Время API
if [ -n "$TOTAL_TIME" ]; then
    if (( $(echo "$TOTAL_TIME < 0.1" | bc -l 2>/dev/null) )); then
        SCORE=$((SCORE + 2))
    elif (( $(echo "$TOTAL_TIME < 0.3" | bc -l 2>/dev/null) )); then
        SCORE=$((SCORE + 1))
    fi
fi

# Стабильность
if [ $TIMEOUT_COUNT -eq 0 ] && [ $SLOW_COUNT -eq 0 ]; then
    SCORE=$((SCORE + 2))
elif [ $TIMEOUT_COUNT -eq 0 ] && [ $SLOW_COUNT -lt 3 ]; then
    SCORE=$((SCORE + 1))
else
    COMMENTS+=("  - Проблемы со стабильностью (таймауты/выбросы)")
fi

# CPU
if [ -n "$CPU_EVENTS" ]; then
    if (( $(echo "$CPU_EVENTS > 2000" | bc -l 2>/dev/null) )); then
        SCORE=$((SCORE + 2))
    elif (( $(echo "$CPU_EVENTS > 1000" | bc -l 2>/dev/null) )); then
        SCORE=$((SCORE + 1))
    fi
fi

add_result "  Балл: $SCORE из $MAX_SCORE"

if [ $SCORE -ge 8 ]; then
    add_result "  ${GREEN}🏆 ВЕРДИКТ: Отличный VDS! Можно брать.${NC}"
elif [ $SCORE -ge 6 ]; then
    add_result "  ${YELLOW}👍 ВЕРДИКТ: Хороший VDS, но есть нюансы.${NC}"
elif [ $SCORE -ge 4 ]; then
    add_result "  ${YELLOW}⚠️ ВЕРДИКТ: Средний VDS, для тестов подойдет.${NC}"
else
    add_result "  ${RED}❌ ВЕРДИКТ: Плохой VDS, ИЩИТЕ ДРУГОГО ХОСТЕРА!${NC}"
fi

if [ ${#COMMENTS[@]} -gt 0 ]; then
    add_result ""
    add_result "${YELLOW}📌 ЗАМЕЧАНИЯ:${NC}"
    for comment in "${COMMENTS[@]}"; do
        add_result "$comment"
    done
fi

add_result "${CYAN}════════════════════════════════════════════════════════════════════════════════${NC}"

# Выводим всё
print_final_results

# Очистка
rm -f /tmp/test test.* 2>/dev/null
