#!/usr/bin/env sh
set -eu

URL="https://influx.sh/snell/snell-server-v5-linux-amd64"
BIN_NAME="snell-server-5"
ETC_DIR="/etc/snell-5"
CFG="$ETC_DIR/snell-server.conf"
SERVICE="snell5.service"
UNIT="/etc/systemd/system/$SERVICE"
FORCE=0

usage() {
  echo "Usage: $0 [--force]"
  echo "  --force: overwrite existing config and systemd unit"
}

while [ $# -gt 0 ]; do
  case "$1" in
    --force) FORCE=1; shift ;;
    -h|--help) usage; exit 0 ;;
    *) echo "Unknown arg: $1"; usage; exit 1 ;;
  esac
done

IS_ROOT=0
[ "$(id -u)" = "0" ] && IS_ROOT=1
OWNER_UID="${SUDO_UID:-$(id -u)}"
OWNER_GID="${SUDO_GID:-$(id -g)}"

run_priv() {
  if [ "$IS_ROOT" -eq 1 ]; then
    "$@"
  else
    sudo "$@"
  fi
}

need_cmd() {
  command -v "$1" >/dev/null 2>&1 || { echo "Missing command: $1"; exit 1; }
}

need_cmd install
need_cmd systemctl
need_cmd openssl
if command -v curl >/dev/null 2>&1; then
  FETCH='curl -fL -o'
elif command -v wget >/dev/null 2>&1; then
  FETCH='wget -O'
else
  echo "Missing command: curl or wget"
  exit 1
fi
[ "$IS_ROOT" -eq 1 ] || need_cmd sudo

PSK="$(openssl rand -base64 18 | tr -d '\n')"
TMP="$(mktemp)"
trap 'rm -f "$TMP"' EXIT

BIN_DST="/usr/local/bin/$BIN_NAME"

echo "Downloading $URL"
sh -c "$FETCH \"$TMP\" \"$URL\""

echo "Installing binary to $BIN_DST"
run_priv install -m 0755 "$TMP" "$BIN_DST"

echo "Ensuring config dir $ETC_DIR"
run_priv install -d -o "$OWNER_UID" -g "$OWNER_GID" "$ETC_DIR"

if [ ! -f "$CFG" ] || [ "$FORCE" -eq 1 ]; then
  echo "Writing config to $CFG"
  cat <<EOF | run_priv tee "$CFG" >/dev/null
[snell-server]
listen = 0.0.0.0:33888
psk = $PSK
ipv6 = false
EOF
  run_priv chown "$OWNER_UID:$OWNER_GID" "$CFG"
else
  echo "Keeping existing config $CFG"
fi

if [ ! -f "$UNIT" ] || [ "$FORCE" -eq 1 ]; then
  echo "Writing systemd unit to $UNIT"
  cat <<EOF | run_priv tee "$UNIT" >/dev/null
[Unit]
Description=Snell Server v5
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=$BIN_DST -c $CFG
Restart=on-failure
RestartSec=2
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target
EOF
else
  echo "Keeping existing systemd unit $UNIT"
fi

echo "Reloading systemd"
run_priv systemctl daemon-reload

echo "Installed:"
echo "  binary   : $BIN_DST"
echo "  config   : $CFG"
echo "  service  : $SERVICE"
echo "  autostart: disabled"
echo "  started  : no"