#!/bin/bash
# ============================================================
#  wstunnel Client - WireGuard over WebSocket
#  Anpassen: PROXY_SERVER = Domainname eures wstunnel-Servers
# ============================================================

PROXY_SERVER="vpn.example.com"

# Lokaler UDP Port fuer WireGuard (muss mit WG Endpoint uebereinstimmen)
LOCAL_WG_PORT=51820

# Remote WireGuard Port auf dem Server
REMOTE_WG_PORT=51820

# wstunnel Binary (im selben Ordner oder im PATH)
WSTUNNEL_DIR="$(cd "$(dirname "$0")" && pwd)"
WSTUNNEL="$WSTUNNEL_DIR/wstunnel"

# GitHub API
GITHUB_API="https://api.github.com/repos/erebe/wstunnel/releases/latest"

# ============================================================

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

echo ""
echo -e "${GREEN} ############################################${NC}"
echo -e "${GREEN}  wstunnel WireGuard Proxy${NC}"
echo -e "${GREEN} ############################################${NC}"
echo ""
echo -e " Server : ${YELLOW}${PROXY_SERVER}${NC}"
echo -e " Tunnel : UDP localhost:${LOCAL_WG_PORT} --> ${PROXY_SERVER}:${REMOTE_WG_PORT}"
echo ""

# --- Architektur erkennen ---
detect_arch() {
    local arch
    arch=$(uname -m)
    case "$arch" in
        x86_64)  echo "amd64" ;;
        aarch64) echo "arm64" ;;
        armv7*)  echo "armv7" ;;
        armv6*)  echo "armv6" ;;
        *)
            echo -e "${RED} [FEHLER] Unbekannte Architektur: $arch${NC}" >&2
            exit 1
            ;;
    esac
}

# --- Download-Funktion ---
download_wstunnel() {
    echo -e " ${YELLOW}[!] wstunnel nicht gefunden.${NC}"
    echo -e " ${CYAN}[*] Ermittle aktuelle Version von GitHub...${NC}"

    # curl oder wget verfuegbar?
    if command -v curl &>/dev/null; then
        DOWNLOADER="curl"
    elif command -v wget &>/dev/null; then
        DOWNLOADER="wget"
    else
        echo -e " ${RED}[FEHLER] Weder curl noch wget gefunden!${NC}"
        exit 1
    fi

    # Aktuelle Version per GitHub API ermitteln
    if [ "$DOWNLOADER" = "curl" ]; then
        VERSION=$(curl -fsSL "$GITHUB_API" | grep '"tag_name"' | sed 's/.*"tag_name": *"\([^"]*\)".*/\1/')
    else
        VERSION=$(wget -qO- "$GITHUB_API" | grep '"tag_name"' | sed 's/.*"tag_name": *"\([^"]*\)".*/\1/')
    fi

    if [ -z "$VERSION" ]; then
        echo -e " ${RED}[FEHLER] Konnte Version nicht ermitteln. Internetverbindung pruefen.${NC}"
        exit 1
    fi

    echo -e " ${GREEN}[OK] Aktuelle Version: ${VERSION}${NC}"

    # Versionsnummer ohne fuehrendes "v"
    VERNUM="${VERSION#v}"
    ARCH=$(detect_arch)
    TARBALL="wstunnel_${VERNUM}_linux_${ARCH}.tar.gz"
    DOWNLOAD_URL="https://github.com/erebe/wstunnel/releases/download/${VERSION}/${TARBALL}"
    TMP_FILE="/tmp/${TARBALL}"

    echo -e " ${CYAN}[*] Lade herunter: ${DOWNLOAD_URL}${NC}"

    if [ "$DOWNLOADER" = "curl" ]; then
        curl -fL --progress-bar -o "$TMP_FILE" "$DOWNLOAD_URL"
    else
        wget --show-progress -q -O "$TMP_FILE" "$DOWNLOAD_URL"
    fi

    if [ ! -f "$TMP_FILE" ]; then
        echo -e " ${RED}[FEHLER] Download fehlgeschlagen!${NC}"
        echo " Bitte manuell herunterladen: $DOWNLOAD_URL"
        exit 1
    fi

    echo -e " ${CYAN}[*] Entpacke...${NC}"
    tar -xzf "$TMP_FILE" -C "$WSTUNNEL_DIR" wstunnel 2>/dev/null || \
    tar -xzf "$TMP_FILE" -C "$WSTUNNEL_DIR" 2>/dev/null

    rm -f "$TMP_FILE"
    chmod +x "$WSTUNNEL"

    if [ ! -f "$WSTUNNEL" ]; then
        echo -e " ${RED}[FEHLER] wstunnel nach dem Entpacken nicht gefunden!${NC}"
        exit 1
    fi

    echo -e " ${GREEN}[OK] wstunnel erfolgreich installiert (${VERSION}).${NC}"
    echo ""
}

# --- Pruefen ob wstunnel vorhanden, sonst herunterladen ---
if [ ! -f "$WSTUNNEL" ] && ! command -v wstunnel &>/dev/null; then
    download_wstunnel
elif command -v wstunnel &>/dev/null && [ ! -f "$WSTUNNEL" ]; then
    WSTUNNEL="wstunnel"
fi

echo -e " ${YELLOW}Bitte WireGuard Endpoint auf 127.0.0.1:${LOCAL_WG_PORT} setzen!${NC}"
echo " Skript laufen lassen solange VPN aktiv ist."
echo ""

# Sauber beenden bei Strg+C
trap 'echo -e "\n${YELLOW} Tunnel beendet.${NC}"; exit 0' SIGINT SIGTERM

echo -e "${GREEN} Starte Tunnel...${NC}"
echo ""

"$WSTUNNEL" client \
  -L "udp://${LOCAL_WG_PORT}:127.0.0.1:${REMOTE_WG_PORT}?timeout_sec=0" \
  "wss://${PROXY_SERVER}:443"

echo ""
echo -e "${YELLOW} wstunnel beendet.${NC}"
