#!/bin/bash
# ═══════════════════════════════════════════════════════
#  Aeliax · Диагностика Telegram Proxy
#  Этот скрипт проверяет подключение к прокси-серверу
#  и сохраняет результат в файл.
#  Данные никуда не отправляются.
# ═══════════════════════════════════════════════════════

set -euo pipefail

HOST="flight.aeliax.com"
IP="91.243.86.75"
RESULT="/tmp/check_proxy_result.txt"

# Цвета
G='\033[0;32m' R='\033[0;31m' Y='\033[0;33m' B='\033[0;34m' D='\033[0;90m' N='\033[0m' BOLD='\033[1m'

divider() { echo -e "${D}─────────────────────────────────────────────${N}"; }

header() {
    clear
    echo ""
    echo -e "${BOLD}  ╔═══════════════════════════════════════════╗${N}"
    echo -e "${BOLD}  ║   Aeliax · Диагностика Telegram Proxy    ║${N}"
    echo -e "${BOLD}  ╚═══════════════════════════════════════════╝${N}"
    echo ""
    echo -e "  ${D}Сервер:${N}  $HOST"
    echo -e "  ${D}IP:${N}      $IP"
    echo -e "  ${D}Дата:${N}    $(date '+%Y-%m-%d %H:%M:%S')"
    echo ""
    divider
}

log() { echo "$1" >> "$RESULT"; }
show() { echo -e "  $1"; log "$(echo -e "$1" | sed 's/\x1b\[[0-9;]*m//g')"; }

check_ok()   { show "${G}✓${N}  $1"; }
check_fail() { show "${R}✗${N}  $1"; }
check_warn() { show "${Y}!${N}  $1"; }
check_info() { show "${B}›${N}  $1"; }
step()       { echo ""; show "${BOLD}$1${N}"; echo ""; log ""; log "=== $1 ==="; log ""; }

header

: > "$RESULT"
log "Aeliax · Диагностика Telegram Proxy"
log "Дата: $(date '+%Y-%m-%d %H:%M:%S')"
log "Система: $(uname -s) $(uname -r)"
log ""

# ── 1. DNS ──────────────────────────────────────────

step "Шаг 1 из 3 · Проверка DNS"

DNS_OUT=$(nslookup "$HOST" 2>&1) || true
RESOLVED_IP=$(echo "$DNS_OUT" | grep -A1 "Name:" | grep "Address" | head -1 | awk '{print $2}')

if [ -z "$RESOLVED_IP" ]; then
    RESOLVED_IP=$(echo "$DNS_OUT" | grep "Address" | tail -1 | awk '{print $2}' | tr -d '#53')
fi

log "$DNS_OUT"

if echo "$RESOLVED_IP" | grep -q "$IP"; then
    check_ok "DNS резолвится корректно → ${BOLD}$IP${N}"
else
    if [ -z "$RESOLVED_IP" ]; then
        check_fail "DNS не резолвится — домен $HOST не найден"
    else
        check_warn "DNS резолвится в ${BOLD}$RESOLVED_IP${N} (ожидался $IP)"
    fi
fi

# ── 2. Подключение ──────────────────────────────────

step "Шаг 2 из 3 · Проверка подключения"

check_info "Подключение к ${BOLD}$HOST:443${N}..."

CURL_OUT=$(curl -sv --max-time 15 "https://$HOST/" 2>&1) || true
log "$CURL_OUT"

if echo "$CURL_OUT" | grep -q "Connected to"; then
    CONNECT_TIME=$(echo "$CURL_OUT" | grep -oE "Trying [0-9.]+" | head -1)
    check_ok "TCP подключение установлено"

    if echo "$CURL_OUT" | grep -q "SSL_ERROR_SYSCALL\|ssl_handshake\|LibreSSL\|OpenSSL"; then
        check_ok "TLS завершился ожидаемо (сервер прокси, не веб-сервер)"
        check_ok "Прокси-сервер доступен и работает"
    elif echo "$CURL_OUT" | grep -q "SSL certificate problem"; then
        check_warn "Проблема с SSL-сертификатом"
    fi
else
    if echo "$CURL_OUT" | grep -q "Could not resolve"; then
        check_fail "Не удалось разрешить имя $HOST"
    elif echo "$CURL_OUT" | grep -q "Connection timed out\|Operation timed out"; then
        check_fail "Таймаут подключения — порт 443 заблокирован или сервер недоступен"
    elif echo "$CURL_OUT" | grep -q "Connection refused"; then
        check_fail "Соединение отклонено — сервер не слушает порт 443"
    else
        check_fail "Не удалось подключиться к $HOST"
    fi
fi

# ── 3. Маршрут ──────────────────────────────────────

step "Шаг 3 из 3 · Маршрут до сервера"

check_info "Трассировка маршрута (может занять до 30 секунд)..."
echo ""

if command -v traceroute &> /dev/null; then
    TR_CMD="traceroute"
elif command -v tracepath &> /dev/null; then
    TR_CMD="tracepath"
else
    TR_CMD=""
fi

if [ -n "$TR_CMD" ]; then
    TR_OUT=$($TR_CMD -m 20 "$HOST" 2>&1) || true
    log "$TR_OUT"

    HOPS=$(echo "$TR_OUT" | grep -cE "^\s*[0-9]+" || echo "0")
    STARS=$(echo "$TR_OUT" | grep -c "\* \* \*" || echo "0")

    echo "$TR_OUT" | while IFS= read -r line; do
        if echo "$line" | grep -q "\* \* \*"; then
            show "  ${D}$line${N}"
        elif echo "$line" | grep -q "$IP"; then
            show "  ${G}$line${N}"
        else
            show "  $line"
        fi
    done

    echo ""
    if echo "$TR_OUT" | grep -q "$IP"; then
        check_ok "Маршрут до сервера полный"
    else
        check_warn "Маршрут не завершён — возможна блокировка на уровне провайдера"
    fi
else
    check_warn "traceroute не установлен — пропускаем"
    log "traceroute не найден"
fi

# ── Итог ────────────────────────────────────────────

echo ""
divider
echo ""
echo -e "  ${BOLD}Диагностика завершена${N}"
echo ""
echo -e "  Результат сохранён в:"
echo -e "  ${BOLD}$RESULT${N}"
echo ""
echo -e "  ${Y}→ Отправьте этот файл администратору${N}"
echo ""
divider
echo ""

log ""
log "═══════════════════════════════════════"
log "Отправьте этот файл администратору."
log "═══════════════════════════════════════"

if command -v xdg-open &> /dev/null; then
    xdg-open /tmp/ 2>/dev/null &
elif command -v open &> /dev/null; then
    open /tmp/
fi
