#!/bin/bash
set -e
SERVER_HOST="tunnel.bhim.si"
BASE_URL="https://tunnel.bhim.si"
FALLBACK_URL="http://88.222.241.153:3000"
INSTALL_DIR="$HOME/.bhim"
CLIENT_DIR="$INSTALL_DIR/client"
BIN_PATH="/usr/local/bin/bhim"
STATIC_KEY="bhim_live_sk_tunnel_2024_static_key"
GREEN='\033[0;32m'; CYAN='\033[0;36m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m'

echo -e "${CYAN}🚇 Bhim Tunnel Installer v1.3.0${NC}"
mkdir -p "$CLIENT_DIR"

# check node
if ! command -v node >/dev/null 2>&1; then
  echo -e "${YELLOW}Node.js not found, installing...${NC}"
  if [[ "$OSTYPE" == "darwin"* ]]; then
    if command -v brew >/dev/null; then brew install node; else echo "Install Node.js from nodejs.org"; exit 1; fi
  else
    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -; sudo apt-get install -y nodejs
  fi
fi
echo "Node $(node -v) OK"

# locate source files (if installing from repo)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [ -f "$SCRIPT_DIR/../client/bhim.sh" ]; then SRC_DIR="$SCRIPT_DIR/../client"; elif [ -f "$SCRIPT_DIR/bhim.sh" ]; then SRC_DIR="$SCRIPT_DIR"; else SRC_DIR=""; fi

if [ -n "$SRC_DIR" ] && [ -f "$SRC_DIR/bhim.sh" ]; then
  echo "Copying local client files..."
  cp "$SRC_DIR/bhim.sh" "$CLIENT_DIR/bhim.sh"
  cp "$SRC_DIR/tunnel-client.js" "$CLIENT_DIR/tunnel-client.js"
  cp "$SRC_DIR/package.json" "$CLIENT_DIR/package.json" 2>/dev/null || echo '{"dependencies":{"ws":"^8.13.0"}}' > "$CLIENT_DIR/package.json"
else
  echo "Downloading from $BASE_URL ..."
  for f in bhim.sh tunnel-client.js; do
    if ! curl -fsSL "$BASE_URL/$f" -o "$CLIENT_DIR/$f" 2>/dev/null; then
      echo "Trying fallback $FALLBACK_URL/$f"
      curl -fsSL "$FALLBACK_URL/$f" -o "$CLIENT_DIR/$f" || { echo "Failed download $f"; exit 1; }
    fi
    chmod +x "$CLIENT_DIR/$f"
  done
fi

echo "Installing deps..."
(cd "$CLIENT_DIR" && npm install --silent 2>&1 | tail -n 3 || npm install ws --silent)

# symlink bin
chmod +x "$CLIENT_DIR/bhim.sh"
if [ -w "/usr/local/bin" ]; then ln -sf "$CLIENT_DIR/bhim.sh" "$BIN_PATH"; else
  echo -e "${YELLOW}Need sudo for /usr/local/bin/bhim${NC}"
  sudo ln -sf "$CLIENT_DIR/bhim.sh" "$BIN_PATH" || {
    echo "Symlink failed, adding to shell rc"
    SHELL_RC="$HOME/.bashrc"; [ -f "$HOME/.zshrc" ] && SHELL_RC="$HOME/.zshrc"
    grep -q "bhim" "$SHELL_RC" 2>/dev/null || echo "alias bhim='$CLIENT_DIR/bhim.sh'" >> "$SHELL_RC"
    echo "Run: source $SHELL_RC"
  }
fi

# default config
mkdir -p "$INSTALL_DIR"
if [ ! -f "$INSTALL_DIR/config.json" ]; then
  cat > "$INSTALL_DIR/config.json" <<JSON
{
  "apiKey": "$STATIC_KEY",
  "subdomain": "myapp",
  "port": 3000,
  "server": "$SERVER_HOST"
}
JSON
fi

echo -e "${GREEN}✅ Installed!${NC}"
echo "Config: $INSTALL_DIR/config.json"
echo ""
echo -e "${CYAN}Usage:${NC}"
echo "  bhim tunnel start --port 3000 --subdomain myapp"
echo "  bhim tunnel start --port 3000 --subdomain hello --foreground"
echo "  → https://myapp.tunnel.bhim.si  (needs *.tunnel DNS)"
echo "  → https://tunnel.bhim.si/t/myapp/ (always works)"
echo ""
echo -e "${YELLOW}If hello.tunnel.bhim.si shows DNS_PROBE_FINISHED_NXDOMAIN, use /t/myapp/ path mode until wildcard DNS propagates.${NC}"
