#!/bin/sh
set -eu

BASE_URL="https://install.adamohq.com"
REMOTE_BINARY="adamo-network"
BINARY_NAME="adamo"

die() { printf 'Error: %s\n' "$1" >&2; exit 1; }

# ── Detect platform ──────────────────────────────────────────────────────

ARCH=$(uname -m)
OS=$(uname -s)

case "$OS" in
  Linux)  OS_TAG="linux" ;;
  *)      die "Unsupported OS: $OS (only Linux is currently supported)" ;;
esac

case "$ARCH" in
  aarch64|arm64) ARCH_TAG="aarch64" ;;
  x86_64)        ARCH_TAG="x86_64" ;;
  *)             die "Unsupported architecture: $ARCH" ;;
esac

# ── Parse args ───────────────────────────────────────────────────────────

API_KEY=""
ROBOT_NAME=""
VERSION=""
PASSTHROUGH_ARGS=""

while [ $# -gt 0 ]; do
  case "$1" in
    --api-key)    API_KEY="$2"; shift 2 ;;
    --api-key=*)  API_KEY="${1#*=}"; shift ;;
    --robot-name) ROBOT_NAME="$2"; shift 2 ;;
    --robot-name=*) ROBOT_NAME="${1#*=}"; shift ;;
    --version)    VERSION="$2"; shift 2 ;;
    --version=*)  VERSION="${1#*=}"; shift ;;
    *)            PASSTHROUGH_ARGS="$PASSTHROUGH_ARGS $1"; shift ;;
  esac
done

fetch() {
  # $1 = URL, $2 = output path (or - for stdout)
  if command -v curl >/dev/null 2>&1; then
    curl -fsSL "$1" -o "$2"
  elif command -v wget >/dev/null 2>&1; then
    wget -qO "$2" "$1"
  else
    die "Neither curl nor wget found. Install one and try again."
  fi
}

# ── Resolve version ──────────────────────────────────────────────────────

if [ -z "$VERSION" ]; then
  printf 'Resolving latest version...\n'
  VERSION=$(fetch "${BASE_URL}/latest.txt" - 2>/dev/null | tr -d '[:space:]') \
    || die "Could not fetch ${BASE_URL}/latest.txt. Pass --version vX.Y.Z manually."
  [ -n "$VERSION" ] || die "latest.txt was empty. Pass --version vX.Y.Z manually."
fi

# Normalize to v-prefix
case "$VERSION" in
  v*) ;;
  *)  VERSION="v${VERSION}" ;;
esac

BINARY_URL="${BASE_URL}/${VERSION}/${ARCH_TAG}-${OS_TAG}/${REMOTE_BINARY}"
SHA_URL="${BINARY_URL}.sha256"

# ── Download + verify binary ─────────────────────────────────────────────

INSTALL_DIR="$HOME/.local/bin"
TMP=$(mktemp)
TMP_SHA=$(mktemp)
trap 'rm -f "$TMP" "$TMP_SHA"' EXIT

printf 'Downloading %s (%s)...\n' "$REMOTE_BINARY" "$VERSION"
fetch "$BINARY_URL" "$TMP"
fetch "$SHA_URL"    "$TMP_SHA"

if command -v sha256sum >/dev/null 2>&1; then
  EXPECTED=$(awk '{print $1}' "$TMP_SHA")
  ACTUAL=$(sha256sum "$TMP" | awk '{print $1}')
  [ "$EXPECTED" = "$ACTUAL" ] || die "Checksum mismatch: expected $EXPECTED, got $ACTUAL"
  printf 'Checksum verified (%s)\n' "$EXPECTED"
else
  printf 'Warning: sha256sum not found, skipping checksum verification.\n' >&2
fi

chmod +x "$TMP"

# ── Install binary ──────────────────────────────────────────────────────

mkdir -p "$INSTALL_DIR"
mv "$TMP" "${INSTALL_DIR}/${BINARY_NAME}"
trap - EXIT
printf 'Installed to %s/%s\n' "$INSTALL_DIR" "$BINARY_NAME"

# Add to PATH if not already there
NEED_SOURCE=""
case ":$PATH:" in
  *":${INSTALL_DIR}:"*) ;;
  *)
    SHELL_RC=""
    if [ -f "$HOME/.bashrc" ]; then
      SHELL_RC="$HOME/.bashrc"
    elif [ -f "$HOME/.zshrc" ]; then
      SHELL_RC="$HOME/.zshrc"
    elif [ -f "$HOME/.profile" ]; then
      SHELL_RC="$HOME/.profile"
    fi

    if [ -n "$SHELL_RC" ]; then
      printf '\n# Adamo CLI\nexport PATH="%s:$PATH"\n' "$INSTALL_DIR" >> "$SHELL_RC"
      export PATH="${INSTALL_DIR}:$PATH"
      NEED_SOURCE="$SHELL_RC"
    fi
    ;;
esac

# ── If no API key provided, just install the binary ──────────────────────

if [ -z "$API_KEY" ] || [ -z "$ROBOT_NAME" ]; then
  printf '\n'
  printf '  Binary:   %s/%s\n' "$INSTALL_DIR" "$BINARY_NAME"
  printf '\n'

  if [ -n "$NEED_SOURCE" ]; then
    printf 'To use "adamo" in your current shell, run:\n\n'
    printf '  source %s\n\n' "$NEED_SOURCE"
  fi

  printf 'Run "adamo --help" to get started.\n'
  exit 0
fi

# ── Set up project directory ─────────────────────────────────────────────

PROJECT_DIR="$HOME/adamo"

if [ ! -d "$PROJECT_DIR" ]; then
  printf 'Creating project directory at %s...\n' "$PROJECT_DIR"
  mkdir -p "$PROJECT_DIR"
fi

cd "$PROJECT_DIR"

# Initialize git repo if not already one
if [ ! -d .git ]; then
  if command -v git >/dev/null 2>&1; then
    git init -q
    printf '# %s\n\nAdamo robot configuration for `%s`.\n\nLaunched with:\n```bash\nadamo --config %s/config.yaml\n```\n' \
      "$ROBOT_NAME" "$ROBOT_NAME" "$PROJECT_DIR" > README.md
    printf 'target/\n' > .gitignore
    git add -A && git commit -q -m "Initial adamo-robot setup"
    printf 'Initialized git repo at %s\n' "$PROJECT_DIR"
  fi
fi

# ── Generate config.yaml ────────────────────────────────────────────────

CONFIG_FILE="$PROJECT_DIR/config.yaml"

if [ -f "$CONFIG_FILE" ]; then
  printf 'Config already exists at %s, skipping generation.\n' "$CONFIG_FILE"
else
  printf 'Generating %s...\n' "$CONFIG_FILE"
  cat > "$CONFIG_FILE" << YAML
api_key: "${API_KEY}"
robot_name: "${ROBOT_NAME}"

ros:
  enabled: true
  backend: "ros2dds"
  auto_start_bridge: true

control:
  enabled: true

# Video tracks can be configured here or from the frontend.
# Example:
# video_tracks:
#   - name: "front-camera"
#     source_type: "jetson_argus"
#     encoder: "nvv4l2h264enc"
#     bitrate: 2000
#     fps: 30
YAML

  if command -v git >/dev/null 2>&1 && [ -d .git ]; then
    git add config.yaml && git commit -q -m "Add config.yaml"
  fi
fi

# ── Launch ───────────────────────────────────────────────────────────────

printf '\n'
printf '  Project:  %s\n' "$PROJECT_DIR"
printf '  Config:   %s\n' "$CONFIG_FILE"
printf '  Binary:   %s/%s\n' "$INSTALL_DIR" "$BINARY_NAME"
printf '\n'

if [ -n "$NEED_SOURCE" ]; then
  printf 'To use "adamo" in your current shell, run:\n\n'
  printf '  source %s\n\n' "$NEED_SOURCE"
fi

printf 'To start adamo, run:\n\n'
printf '  adamo --config %s\n\n' "$CONFIG_FILE"
