#!/bin/bash
# ========== warp_install.sh ==========
# Установка Cloudflare WARP Native

COLOR_GREEN='\033[0;32m'
COLOR_RED='\033[0;31m'
COLOR_YELLOW='\033[0;33m'
COLOR_RESET='\033[0m'

log_info() {
    echo -e "${COLOR_GREEN}[INFO]${COLOR_RESET} $1"
}
log_ok() {
    echo -e "${COLOR_GREEN}[OK]${COLOR_RESET} $1"
}
log_warn() {
    echo -e "${COLOR_YELLOW}[WARN]${COLOR_RESET} $1"
}
log_error() {
    echo -e "${COLOR_RED}[ERROR]${COLOR_RESET} $1"
}

error_exit() {
    log_error "$1"
    exit 1
}

# ---------- ПРОВЕРКА ROOT ----------
if [[ $EUID -ne 0 ]]; then
    error_exit "Скрипт должен запускаться с правами root"
fi

# ---------- ПРОВЕРКА СИСТЕМЫ ----------
if ! command -v apt &>/dev/null; then
    error_exit "Скрипт поддерживает только Ubuntu/Debian"
fi

log_info "Начинаем установку Cloudflare WARP Native"

# ---------- 1. УСТАНОВКА WIREGUARD ----------
log_info "1. Установка WireGuard..."
apt update -qq || error_exit "Не удалось обновить список пакетов"
apt install wireguard -y -qq || error_exit "Не удалось установить WireGuard"
log_ok "WireGuard установлен"

# ---------- 2. ВРЕМЕННЫЕ DNS ----------
log_info "2. Настройка временных DNS (1.1.1.1 + 8.8.8.8)..."
cp /etc/resolv.conf /etc/resolv.conf.backup
echo -e "nameserver 1.1.1.1\nnameserver 8.8.8.8" > /etc/resolv.conf
log_ok "Временные DNS настроены"

# ---------- 3. СКАЧИВАНИЕ WGCF ----------
log_info "3. Скачивание и установка wgcf..."

WGCF_VERSION=$(curl -s "https://api.github.com/repos/ViRb3/wgcf/releases/latest" | grep tag_name | cut -d '"' -f 4)
if [ -z "$WGCF_VERSION" ]; then
    error_exit "Не удалось получить последнюю версию wgcf"
fi

ARCH=$(uname -m)
case $ARCH in
    x86_64) WGCF_ARCH="amd64" ;;
    aarch64|arm64) WGCF_ARCH="arm64" ;;
    armv7l) WGCF_ARCH="armv7" ;;
    *) WGCF_ARCH="amd64" ;;
esac

WGCF_DOWNLOAD_URL="https://github.com/ViRb3/wgcf/releases/download/${WGCF_VERSION}/wgcf_${WGCF_VERSION#v}_linux_${WGCF_ARCH}"
WGCF_BINARY_NAME="wgcf_${WGCF_VERSION#v}_linux_${WGCF_ARCH}"

if command -v wget &>/dev/null; then
    wget -q "$WGCF_DOWNLOAD_URL" -O "$WGCF_BINARY_NAME" || error_exit "Не удалось скачать wgcf"
elif command -v curl &>/dev/null; then
    curl -sL "$WGCF_DOWNLOAD_URL" -o "$WGCF_BINARY_NAME" || error_exit "Не удалось скачать wgcf"
else
    error_exit "Ни wget, ни curl не найдены"
fi

chmod +x "$WGCF_BINARY_NAME"
mv "$WGCF_BINARY_NAME" /usr/local/bin/wgcf
log_ok "wgcf $WGCF_VERSION установлен в /usr/local/bin/wgcf"

# ---------- 4. РЕГИСТРАЦИЯ WGCF ----------
log_info "4. Регистрация wgcf..."

if [[ -f wgcf-account.toml ]]; then
    log_info "Файл wgcf-account.toml уже существует, пропускаем регистрацию"
else
    log_info "Выполняем регистрацию..."
    
    # Пробуем зарегистрироваться с таймаутом
    timeout 60 bash -c 'yes | wgcf register' &>/dev/null
    
    if [[ ! -f wgcf-account.toml ]]; then
        log_info "Пробуем альтернативный метод..."
        yes | wgcf register &>/dev/null || true
        sleep 2
    fi
    
    if [[ ! -f wgcf-account.toml ]]; then
        error_exit "Не удалось зарегистрировать wgcf"
    fi
    log_ok "Регистрация выполнена"
fi

wgcf generate &>/dev/null || error_exit "Не удалось сгенерировать конфигурацию"
log_ok "Конфигурация wgcf сгенерирована"

# ---------- 5. РЕДАКТИРОВАНИЕ КОНФИГА ----------
log_info "5. Редактирование конфигурации WARP..."

WGCF_CONF_FILE="wgcf-profile.conf"
if [ ! -f "$WGCF_CONF_FILE" ]; then
    error_exit "Файл $WGCF_CONF_FILE не найден"
fi

sed -i '/^DNS =/d' "$WGCF_CONF_FILE"
sed -i '/^MTU =/aTable = off' "$WGCF_CONF_FILE"
sed -i '/^Endpoint =/aPersistentKeepalive = 25' "$WGCF_CONF_FILE"

mkdir -p /etc/wireguard || error_exit "Не удалось создать /etc/wireguard"
mv "$WGCF_CONF_FILE" /etc/wireguard/warp.conf
log_ok "Конфигурация сохранена в /etc/wireguard/warp.conf"

# ---------- 6. УДАЛЕНИЕ IPv6 ----------
log_info "6. Удаление IPv6 из конфигурации..."
sed -i 's/,\s*[0-9a-fA-F:]\+\/128//' /etc/wireguard/warp.conf
sed -i '/Address = [0-9a-fA-F:]\+\/128/d' /etc/wireguard/warp.conf
log_ok "IPv6 удалён из конфигурации"

# ---------- 7. ПОДКЛЮЧЕНИЕ WARP ----------
log_info "7. Подключение интерфейса WARP..."
systemctl start wg-quick@warp &>/dev/null || error_exit "Не удалось подключить интерфейс"
log_ok "Интерфейс WARP подключен"

# ---------- 8. АВТОЗАПУСК ----------
log_info "8. Включение автозапуска WARP..."
systemctl enable wg-quick@warp &>/dev/null
log_ok "Автозапуск включен"

# ---------- 9. WATCHDOG ----------
log_info "9. Настройка WARP Watchdog..."

mkdir -p /opt/warp-native/logs

cat > /opt/warp-native/config.env <<EOF
# warp-native watchdog configuration
HANDSHAKE_THRESHOLD=180
RESTART_COOLDOWN=120
LOG_MAX_LINES=1000
EOF

cat > /opt/warp-native/warp-watchdog.sh <<'WATCHDOG_EOF'
#!/bin/bash
CONFIG="/opt/warp-native/config.env"
LOG="/opt/warp-native/logs/watchdog.log"
COOLDOWN_FILE="/opt/warp-native/logs/.last_restart"

if [[ -f "$CONFIG" ]]; then
    source "$CONFIG"
fi

HANDSHAKE_THRESHOLD="${HANDSHAKE_THRESHOLD:-180}"
RESTART_COOLDOWN="${RESTART_COOLDOWN:-120}"
LOG_MAX_LINES="${LOG_MAX_LINES:-1000}"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$1] $2" >> "$LOG"
}

if ! systemctl is-active --quiet wg-quick@warp; then
    log "RESTART" "Service not active, restarting..."
    systemctl restart wg-quick@warp
    date +%s > "$COOLDOWN_FILE"
    exit 0
fi

handshake_ts=$(wg show warp latest-handshakes 2>/dev/null | awk '{print $2}')
if [[ -z "$handshake_ts" || "$handshake_ts" -eq 0 ]]; then
    log "RESTART" "No handshake, restarting..."
    systemctl restart wg-quick@warp
    date +%s > "$COOLDOWN_FILE"
    exit 0
fi

now=$(date +%s)
age=$(( now - handshake_ts ))
if [[ $age -gt $HANDSHAKE_THRESHOLD ]]; then
    log "RESTART" "Handshake too old (${age}s), restarting..."
    systemctl restart wg-quick@warp
    date +%s > "$COOLDOWN_FILE"
    exit 0
fi

if ! ping -I warp -c 2 -W 3 1.1.1.1 &>/dev/null; then
    log "RESTART" "Ping via warp failed, restarting..."
    systemctl restart wg-quick@warp
    date +%s > "$COOLDOWN_FILE"
    exit 0
fi

log "OK" "WARP is healthy (handshake: ${age}s ago)"
WATCHDOG_EOF

chmod +x /opt/warp-native/warp-watchdog.sh
log_ok "Watchdog скрипт создан"

cat > /etc/cron.d/warp-native <<EOF
*/10 * * * * root /opt/warp-native/warp-watchdog.sh
EOF

chmod 644 /etc/cron.d/warp-native
log_ok "Cron задача создана"

# ---------- 10. КОМАНДА WARP ----------
log_info "10. Создание команды warp..."

cat > /usr/local/bin/warp <<'WARP_CMD_EOF'
#!/bin/bash
COLOR_GREEN='\033[0;32m'
COLOR_RED='\033[0;31m'
COLOR_YELLOW='\033[0;33m'
COLOR_RESET='\033[0m'

show_status() {
    echo ""
    echo -e "${COLOR_GREEN}═══════════════ WARP STATUS ═══════════════${COLOR_RESET}"
    
    if systemctl is-active --quiet wg-quick@warp; then
        status="${COLOR_GREEN}active${COLOR_RESET}"
    else
        status="${COLOR_RED}inactive${COLOR_RESET}"
    fi
    
    tunnel_ip=$(ip addr show warp 2>/dev/null | grep 'inet ' | awk '{print $2}' | head -1)
    [ -z "$tunnel_ip" ] && tunnel_ip="—"
    
    hs_ts=$(wg show warp latest-handshakes 2>/dev/null | awk '{print $2}')
    if [[ -n "$hs_ts" && "$hs_ts" -gt 0 ]]; then
        age=$(( $(date +%s) - hs_ts ))
        handshake="${age}s ago"
    else
        handshake="—"
    fi
    
    account_type=$(wgcf status 2>/dev/null | grep -i "Account type" | awk -F': ' '{print $2}' | xargs)
    if [[ "$account_type" == "unlimited" ]]; then
        account="WARP+"
    elif [[ -n "$account_type" ]]; then
        account="Free"
    else
        account="—"
    fi
    
    echo -e "  Статус      : $status"
    echo -e "  IP туннеля  : $tunnel_ip"
    echo -e "  Handshake   : $handshake"
    echo -e "  Аккаунт     : $account"
    echo ""
    echo -e "${COLOR_GREEN}────────────────────────────────────────────${COLOR_RESET}"
    echo -e "  ${COLOR_GREEN}warp start${COLOR_RESET}    — запустить"
    echo -e "  ${COLOR_GREEN}warp stop${COLOR_RESET}     — остановить"
    echo -e "  ${COLOR_GREEN}warp restart${COLOR_RESET}  — перезапустить"
    echo -e "  ${COLOR_GREEN}warp log${COLOR_RESET}      — лог watchdog"
    echo -e "${COLOR_GREEN}────────────────────────────────────────────${COLOR_RESET}"
    echo ""
}

case "$1" in
    start)   systemctl start wg-quick@warp ;;
    stop)    systemctl stop wg-quick@warp ;;
    restart) systemctl restart wg-quick@warp ;;
    log)
        if [[ ! -f /opt/warp-native/logs/watchdog.log ]]; then
            echo "Лог пока пуст"
        else
            tail -f /opt/warp-native/logs/watchdog.log
        fi
        ;;
    *)       show_status ;;
esac
WARP_CMD_EOF

chmod +x /usr/local/bin/warp
log_ok "Команда warp создана"

# ---------- 11. ПРОВЕРКА СТАТУСА ----------
log_info "Проверка статуса WARP..."

sleep 3

if wg show warp &>/dev/null; then
    log_ok "Интерфейс WARP работает"
else
    log_warn "Интерфейс WARP не найден"
fi

# Проверка через Cloudflare
curl_result=$(curl -s --interface warp --max-time 5 https://www.cloudflare.com/cdn-cgi/trace 2>/dev/null | grep "warp=" | cut -d= -f2)

if [[ "$curl_result" == "on" ]] || [[ "$curl_result" == "plus" ]]; then
    log_ok "Cloudflare подтверждает WARP ($curl_result)"
else
    log_warn "Cloudflare не подтвердил WARP, но интерфейс работает"
fi

# ---------- 12. ИТОГ ----------
echo ""
echo -e "${COLOR_GREEN}═════════════════════════════════════════════${COLOR_RESET}"
echo -e "${COLOR_GREEN}  ✅ УСТАНОВКА CLOUDFLARE WARP ЗАВЕРШЕНА!${COLOR_RESET}"
echo -e "${COLOR_GREEN}═════════════════════════════════════════════${COLOR_RESET}"
echo ""
echo -e "  ${COLOR_GREEN}➤${COLOR_RESET} Для просмотра статуса: ${COLOR_YELLOW}warp${COLOR_RESET}"
echo -e "  ${COLOR_GREEN}➤${COLOR_RESET} Для управления: ${COLOR_YELLOW}warp start|stop|restart${COLOR_RESET}"
echo -e "  ${COLOR_GREEN}➤${COLOR_RESET} Просмотр лога: ${COLOR_YELLOW}warp log${COLOR_RESET}"
echo -e "  ${COLOR_GREEN}➤${COLOR_RESET} Конфиг Watchdog: ${COLOR_YELLOW}/opt/warp-native/config.env${COLOR_RESET}"
echo ""
echo -e "${COLOR_GREEN}═════════════════════════════════════════════${COLOR_RESET}"

# Восстанавливаем DNS (если был бэкап)
if [[ -f /etc/resolv.conf.backup ]]; then
    cp /etc/resolv.conf.backup /etc/resolv.conf
    rm -f /etc/resolv.conf.backup
    log_ok "DNS восстановлены"
fi

exit 0
