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

VERSION="${DRAFTPILOT_VERSION:-0.1.1}"
BASE_URL="${DRAFTPILOT_BASE_URL:-https://draftpilot-releases.jerriebright.workers.dev}"
INSTALL_DIR="${DRAFTPILOT_INSTALL_DIR:-$HOME/.draftpilot/bin}"
CONFIG_DIR="${DRAFTPILOT_CONFIG_DIR:-$HOME/.draftpilot/config}"
TELEMETRY_FILE="$CONFIG_DIR/telemetry.json"
TELEMETRY_URL="${DRAFTPILOT_TELEMETRY_URL:-https://jerrinbright.com/draftpilot/api/telemetry}"
TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/draftpilot-install.XXXXXX")"

cleanup() {
  rm -rf "$TMP_DIR"
}
trap cleanup EXIT

info() {
  printf '==> %s\n' "$1"
}

fail() {
  printf 'DraftPilot install failed: %s\n' "$1" >&2
  exit 1
}

need_cmd() {
  command -v "$1" >/dev/null 2>&1 || fail "missing required command: $1"
}

telemetry_disabled() {
  case "${DRAFTPILOT_TELEMETRY:-}" in
    0|false|FALSE|False|off|OFF|Off|no|NO|No|disabled|DISABLED) return 0 ;;
    *) return 1 ;;
  esac
}

new_install_id() {
  if command -v uuidgen >/dev/null 2>&1; then
    uuidgen | tr '[:upper:]' '[:lower:]'
  elif [ -r /proc/sys/kernel/random/uuid ]; then
    cat /proc/sys/kernel/random/uuid
  else
    printf 'anon-%s-%s' "$(date +%s)" "$$"
  fi
}

install_id() {
  mkdir -p "$CONFIG_DIR" 2>/dev/null || true
  if [ -f "$TELEMETRY_FILE" ]; then
    sed -n 's/.*"installId"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$TELEMETRY_FILE" | head -1
    return
  fi
  local id
  id="$(new_install_id)"
  printf '{\n  "installId": "%s",\n  "telemetry": true,\n  "createdAt": "%s"\n}\n' "$id" "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" > "$TELEMETRY_FILE" 2>/dev/null || true
  printf '%s' "$id"
}

send_telemetry() {
  local event platform success id payload
  event="$1"
  platform="$2"
  success="$3"
  telemetry_disabled && return 0
  command -v curl >/dev/null 2>&1 || return 0
  case "$TELEMETRY_URL" in http://*|https://*) ;; *) return 0 ;; esac
  id="$(install_id)"
  [ -n "$id" ] || return 0
  payload=$(cat <<JSON
{"event":"$event","version":"$VERSION","runtime":"installer","platform":"$platform","installId":"$id","timestamp":"$(date -u '+%Y-%m-%dT%H:%M:%SZ')","command":"install","success":$success,"timezone":"${TZ:-}","locale":"${LANG:-}","details":{"installer":"shell"}}
JSON
)
  curl -fsS -m 2 -o /dev/null -H 'content-type: application/json' -d "$payload" "$TELEMETRY_URL" >/dev/null 2>&1 || true
}

detect_platform() {
  local os arch
  os="$(uname -s)"
  arch="$(uname -m)"
  case "$os:$arch" in
    Darwin:arm64|Darwin:aarch64) printf 'macos-arm64' ;;
    Linux:x86_64|Linux:amd64) printf 'linux-x64' ;;
    *)
      fail "unsupported platform $os/$arch. Use the manual download links for Windows or unsupported architectures."
      ;;
  esac
}

sha256_file() {
  if command -v sha256sum >/dev/null 2>&1; then
    sha256sum "$1" | awk '{print $1}'
  elif command -v shasum >/dev/null 2>&1; then
    shasum -a 256 "$1" | awk '{print $1}'
  else
    fail "missing sha256sum or shasum for checksum verification"
  fi
}

expected_sha() {
  case "$1" in
    macos-arm64) printf 'cf800d659d043187edb4d3e6817d607f43684b5e4f246ff98358c1564ab30ee3' ;;
    linux-x64) printf '6d2b983ba345a079d4116a3b71f8cab572d43069050d13a72de3280ce4aedf2d' ;;
    *) fail "no checksum configured for $1" ;;
  esac
}

profile_file() {
  case "${SHELL:-}" in
    */zsh) printf '%s/.zshrc' "$HOME" ;;
    */bash) printf '%s/.bashrc' "$HOME" ;;
    *) printf '%s/.profile' "$HOME" ;;
  esac
}

ensure_path_hint() {
  case ":${PATH:-}:" in
    *":$INSTALL_DIR:"*) return 0 ;;
  esac

  local rc marker line
  rc="$(profile_file)"
  marker="# DraftPilot CLI"
  line="export PATH=\"$INSTALL_DIR:\$PATH\""

  if [ "${DRAFTPILOT_SKIP_PATH_UPDATE:-0}" = "1" ]; then
    printf '\nAdd DraftPilot to your PATH:\n  %s\n' "$line"
    return 0
  fi

  touch "$rc" 2>/dev/null || {
    printf '\nAdd DraftPilot to your PATH:\n  %s\n' "$line"
    return 0
  }

  if ! grep -F "$line" "$rc" >/dev/null 2>&1; then
    {
      printf '\n%s\n' "$marker"
      printf '%s\n' "$line"
    } >> "$rc"
    info "Added $INSTALL_DIR to PATH in $rc"
  fi
}

need_cmd curl
need_cmd tar

PLATFORM="$(detect_platform)"
ARCHIVE="draftpilot-${VERSION}-${PLATFORM}.tar.gz"
BINARY="draftpilot-${PLATFORM}"
URL="${BASE_URL%/}/releases/$ARCHIVE"
ARCHIVE_PATH="$TMP_DIR/$ARCHIVE"
EXPECTED_SHA="$(expected_sha "$PLATFORM")"

send_telemetry "install_started" "$PLATFORM" true

info "Installing DraftPilot $VERSION for $PLATFORM"
info "Downloading $URL"
curl -fL --retry 3 --connect-timeout 15 -o "$ARCHIVE_PATH" "$URL"

ACTUAL_SHA="$(sha256_file "$ARCHIVE_PATH")"
if [ "$ACTUAL_SHA" != "$EXPECTED_SHA" ]; then
  fail "checksum mismatch for $ARCHIVE. Expected $EXPECTED_SHA, got $ACTUAL_SHA"
fi

tar -xzf "$ARCHIVE_PATH" -C "$TMP_DIR"
[ -f "$TMP_DIR/$BINARY" ] || fail "archive did not contain $BINARY"

mkdir -p "$INSTALL_DIR"
install -m 755 "$TMP_DIR/$BINARY" "$INSTALL_DIR/$BINARY"
ln -sf "$INSTALL_DIR/$BINARY" "$INSTALL_DIR/draftpilot"

ensure_path_hint

info "Installed $INSTALL_DIR/draftpilot"
"$INSTALL_DIR/draftpilot" version || true
send_telemetry "install_succeeded" "$PLATFORM" true

printf '\nRun this now if your shell has not reloaded PATH yet:\n'
printf '  export PATH="%s:$PATH"\n' "$INSTALL_DIR"
printf '\nUseful commands:\n'
printf '  draftpilot doctor --paper /path/to/paper --codebase /path/to/code\n'
printf '  draftpilot launch --paper /path/to/paper --codebase /path/to/code --open\n'
printf '  draftpilot launch --host user@vm --paper /remote/paper --codebase /remote/code --open\n'
printf '  draftpilot update\n'
printf '\nNote: DraftPilot uses your system LaTeX install. Install TeX Live/MacTeX/BasicTeX plus latexmk if doctor reports missing LaTeX tools.\n'
