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

BASE_URL="${AGENTL_BASE_URL:-http://188.214.37.12/agentl}"
FALLBACK_BASE_URL="${AGENTL_FALLBACK_BASE_URL:-http://188.214.37.12/agentl}"
INSTALL_DIR="${AGENTL_INSTALL_DIR:-$HOME/.local/share/agentl}"
BIN_DIR="${AGENTL_BIN_DIR:-$HOME/.local/bin}"
BIN_PATH="$BIN_DIR/agentl"

usage() {
  cat <<'EOF'
Usage:
  install-agentl.sh [--id DEVICE_ID] [--password PASSWORD] [--install-dir DIR] [--bin-dir DIR]

Behavior:
  - downloads the latest Linux Agentl bundle
  - installs it into the local user profile
  - creates/updates ~/.local/bin/agentl and adds it to PATH for future shells
  - starts the agent in background with saved credentials

If --password is omitted, the script will ask for it. If --id is omitted, Agentl will generate one automatically.
EOF
}

DEVICE_ID=""
DEVICE_PASSWORD=""

while [[ $# -gt 0 ]]; do
  case "$1" in
    --id)
      DEVICE_ID="${2:-}"
      shift 2
      ;;
    --password)
      DEVICE_PASSWORD="${2:-}"
      shift 2
      ;;
    --install-dir)
      INSTALL_DIR="${2:-}"
      shift 2
      ;;
    --bin-dir)
      BIN_DIR="${2:-}"
      BIN_PATH="$BIN_DIR/agentl"
      shift 2
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "Unknown argument: $1" >&2
      usage >&2
      exit 1
      ;;
  esac
done

read_secret() {
  local prompt="$1"
  local value
  read -r -s -p "$prompt" value
  printf '\n' >&2
  printf '%s' "$value"
}

if [[ -z "$DEVICE_PASSWORD" ]]; then
  DEVICE_PASSWORD="$(read_secret 'Agentl password: ')"
fi

mkdir -p "$INSTALL_DIR" "$BIN_DIR"

TMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TMP_DIR"' EXIT

ARCHIVE_PATH="$TMP_DIR/agentl-linux.tar.gz"
DOWNLOAD_TAG="$(date +%s)"
PRIMARY_URL="$BASE_URL/agentl-linux.tar.gz?v=$DOWNLOAD_TAG"
FALLBACK_URL="$FALLBACK_BASE_URL/agentl-linux.tar.gz?v=$DOWNLOAD_TAG"

if ! curl --http1.1 --retry 5 --retry-delay 1 -fsSL "$PRIMARY_URL" -o "$ARCHIVE_PATH"; then
  curl --retry 5 --retry-delay 1 -fsSL "$FALLBACK_URL" -o "$ARCHIVE_PATH"
fi
tar -xzf "$ARCHIVE_PATH" -C "$TMP_DIR"

install -m 755 "$TMP_DIR/agentl-bundle-linux" "$INSTALL_DIR/agentl"
install -m 644 "$TMP_DIR/README.md" "$INSTALL_DIR/README.md"
cat > "$BIN_PATH" <<EOF
#!/usr/bin/env bash
exec "$INSTALL_DIR/agentl" "\$@"
EOF
chmod +x "$BIN_PATH"

PROFILE_SNIPPET='export PATH="$HOME/.local/bin:$PATH"'
for profile in "$HOME/.profile" "$HOME/.bashrc" "$HOME/.zshrc"; do
  if [[ -f "$profile" ]] && ! grep -Fq "$PROFILE_SNIPPET" "$profile"; then
    printf '\n%s\n' "$PROFILE_SNIPPET" >> "$profile"
  fi
done
export PATH="$BIN_DIR:$PATH"

"$INSTALL_DIR/agentl" config set-relay --host 188.214.37.12 --fallback-host suoriks.space --port 47123 --fingerprint "32:47:DB:E0:28:3C:31:55:7B:57:E6:66:84:15:A5:9B:DD:8A:29:D3:56:9E:51:82:C6:21:3F:04:3A:16:BD:C7"

UP_ARGS=(up)
if [[ -n "$DEVICE_ID" ]]; then
  UP_ARGS+=(--id "$DEVICE_ID")
fi
if [[ -n "$DEVICE_PASSWORD" ]]; then
  UP_ARGS+=(--password "$DEVICE_PASSWORD")
fi
"$INSTALL_DIR/agentl" "${UP_ARGS[@]}"

cat <<EOF
Installed:
  Binary: $INSTALL_DIR/agentl
  Wrapper: $BIN_PATH
  PATH: ~/.local/bin added for future shells

Next commands:
  agentl
  agentl status
  agentl credentials
  agentl down
EOF
