#!/usr/bin/bash
set -euo pipefail

ENV_FILE="${FT_ENV_FILE:-/etc/fasttunnel/fasttunnel.env}"
if [[ -r "$ENV_FILE" ]]; then
  set -a
  # shellcheck disable=SC1090
  source "$ENV_FILE"
  set +a
fi

: "${FT_NODE:?FT_NODE missing; run fasttunnel-firstboot}"
: "${FT_PEER_NODE:=2}"
: "${FT_LOCAL:=auto}"
: "${FT_NETWORK:=10.77.0.0/16}"
: "${FT_TUN:=ft0}"
: "${FT_LISTEN:=30002}"
: "${FT_CONTROL:=$((FT_LISTEN + 1000))}"
: "${FT_TLS_PORT:=$FT_LISTEN}"
: "${FT_NETWORK_ID:=0}"
: "${FT_PIN:=0}"
: "${FT_SEED:=0}"
: "${FT_COORD:=0}"
if [[ -z "${FT_EXIT+x}" ]]; then
  if [[ "${FT_LOCAL:-auto}" != "auto" && -z "${FT_PEER:-}" ]]; then
    FT_EXIT=1
    echo "[ROLE] FT_EXIT missing; auto-enabling EXIT for fixed standalone Linux node" >&2
  else
    FT_EXIT=0
  fi
fi
: "${FT_LEARN_PEER:=1}"
: "${FT_PEER:=}"
: "${FT_TRANSPORT:=auto}"
: "${FT_IDENTITY_FILE:=/etc/fasttunnel/node.key}"
: "${FT_SHAPER:=privacy}"

STATE_DIR=/var/lib/fasttunnel
mkdir -p "$STATE_DIR"
chmod 700 "$STATE_DIR"

if [[ "$FT_PIN" == "0" ]]; then
  if [[ -s "$STATE_DIR/pin" ]]; then
    FT_PIN="$(cat "$STATE_DIR/pin")"
  else
    rnd="$(od -An -N4 -tu4 /dev/urandom | tr -d ' ')"
    FT_PIN=$((100000 + rnd % 900000))
    printf '%06d\n' "$FT_PIN" > "$STATE_DIR/pin"
    chmod 600 "$STATE_DIR/pin"
  fi
fi

# The C bootstrap parser currently accepts a numeric IPv4 endpoint only.
# Let administrators keep a DNS name in fasttunnel.env and resolve it immediately
# before exec. The original config remains human-readable and follows DNS changes
# after a service restart.
if [[ -n "$FT_PEER" ]]; then
  peer_host="${FT_PEER%:*}"
  peer_port="${FT_PEER##*:}"
  if [[ "$peer_host" != "$FT_PEER" && ! "$peer_host" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    peer_ipv4="$(getent ahostsv4 "$peer_host" 2>/dev/null | awk 'NR==1{print $1}')"
    if [[ -z "$peer_ipv4" ]]; then
      echo "[BOOTSTRAP] ERROR: cannot resolve IPv4 for $peer_host" >&2
      exit 1
    fi
    echo "[BOOTSTRAP] resolved $peer_host -> $peer_ipv4" >&2
    FT_PEER="${peer_ipv4}:${peer_port}"
  fi
fi

args=(
  --node "$FT_NODE"
  --peer-node "$FT_PEER_NODE"
  --local "$FT_LOCAL"
  --network "$FT_NETWORK"
  --listen "$FT_LISTEN"
  --control "$FT_CONTROL"
  --tls-port "$FT_TLS_PORT"
  --network-id "$FT_NETWORK_ID"
  --pin "$FT_PIN"
  --tun "$FT_TUN"
  --transport "$FT_TRANSPORT"
  --identity-file "$FT_IDENTITY_FILE"
  --shaper "$FT_SHAPER"
)

[[ "$FT_LEARN_PEER" == "1" ]] && args+=(--learn-peer)
[[ "$FT_SEED" == "1" ]] && args+=(--seed)
[[ "$FT_EXIT" == "1" ]] && args+=(--exit)
[[ "$FT_COORD" == "1" ]] && args+=(--coord)
[[ -n "$FT_PEER" ]] && args+=(--peer "$FT_PEER")

exec /usr/local/sbin/fasttunnel-linux "${args[@]}"
