#!/usr/bin/env bash
# Outlit CLI installer
# Usage: curl -fsSL https://outlit.ai/install.sh | bash
set -euo pipefail

REPO="OutlitAI/outlit-sdk"
INSTALL_DIR="${OUTLIT_INSTALL_DIR:-$HOME/.outlit/bin}"
BINARY_NAME="outlit"

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
CYAN='\033[0;36m'
DIM='\033[2m'
RESET='\033[0m'

info() { printf "${CYAN}%s${RESET}\n" "$*"; }
success() { printf "${GREEN}%s${RESET}\n" "$*"; }
error() { printf "${RED}error:${RESET} %s\n" "$*" >&2; exit 1; }

# --- Detect platform ---
OS="$(uname -s)"
ARCH="$(uname -m)"

case "$OS" in
  Darwin) PLATFORM="darwin" ;;
  Linux)  PLATFORM="linux" ;;
  *)      error "Unsupported OS: $OS. Use npm install -g @outlit/cli instead." ;;
esac

case "$ARCH" in
  x86_64|amd64) ARCH="x64" ;;
  arm64|aarch64) ARCH="arm64" ;;
  *)             error "Unsupported architecture: $ARCH" ;;
esac

TARGET="${BINARY_NAME}-${PLATFORM}-${ARCH}"

# --- Find latest CLI release ---
info "Finding latest Outlit CLI release..."

GITHUB_HEADERS=(-H "Accept: application/vnd.github+json")
if [ -n "${GITHUB_TOKEN:-}" ]; then
  GITHUB_HEADERS+=(-H "Authorization: Bearer $GITHUB_TOKEN")
fi

RELEASE_JSON=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases?per_page=20" \
  "${GITHUB_HEADERS[@]}") || error "Failed to fetch releases from GitHub. If rate-limited, set GITHUB_TOKEN."

# Find the latest @outlit/cli@ release with the expected platform archive.
if command -v jq &>/dev/null; then
  CANDIDATE_TAGS=$(echo "$RELEASE_JSON" | jq -r '.[] | select(.tag_name | startswith("@outlit/cli@")) | .tag_name' | sed 's/^@outlit\/cli@//')
else
  CANDIDATE_TAGS=$(echo "$RELEASE_JSON" | grep -o '"tag_name": *"@outlit/cli@[^"]*"' | sed 's/.*"@outlit\/cli@\([^"]*\)".*/\1/')
fi

if [ -z "${CANDIDATE_TAGS:-}" ]; then
  error "Could not find a CLI release. Please install manually: npm install -g @outlit/cli"
fi

VERSION=""
DOWNLOAD_URL=""
while IFS= read -r CANDIDATE_TAG; do
  [ -n "$CANDIDATE_TAG" ] || continue

  CANDIDATE_URL="https://github.com/${REPO}/releases/download/%40outlit%2Fcli%40${CANDIDATE_TAG}/${TARGET}.tar.gz"
  if curl -fsSLI "$CANDIDATE_URL" "${GITHUB_HEADERS[@]}" >/dev/null 2>&1; then
    VERSION="$CANDIDATE_TAG"
    DOWNLOAD_URL="$CANDIDATE_URL"
    break
  fi
done <<< "$CANDIDATE_TAGS"

if [ -z "$VERSION" ]; then
  error "Could not find a CLI release with ${TARGET}.tar.gz. Please install manually: npm install -g @outlit/cli"
fi

info "Installing outlit v${VERSION} (${PLATFORM}-${ARCH})..."

# --- Download and extract ---
TMPDIR_PATH=$(mktemp -d)
trap 'rm -rf "$TMPDIR_PATH"' EXIT

curl -fsSL "$DOWNLOAD_URL" -o "${TMPDIR_PATH}/${TARGET}.tar.gz" || error "Download failed. Check https://github.com/${REPO}/releases for available builds."

# TODO: verify checksum when .sha256 files are published alongside release assets

tar -xzf "${TMPDIR_PATH}/${TARGET}.tar.gz" -C "$TMPDIR_PATH" || error "Failed to extract archive."

chmod +x "${TMPDIR_PATH}/${BINARY_NAME}"

# --- Install binary ---
mkdir -p "$INSTALL_DIR" || error "Failed to create install directory: $INSTALL_DIR"
mv "${TMPDIR_PATH}/${BINARY_NAME}" "${INSTALL_DIR}/${BINARY_NAME}"

# --- Configure PATH ---
add_to_path() {
  local config_file="$1"
  local line="$2"

  # Skip if already present
  if [ -f "$config_file" ] && grep -qF "$line" "$config_file"; then
    return
  fi

  echo "" >> "$config_file"
  echo "# Outlit CLI" >> "$config_file"
  echo "$line" >> "$config_file"
}

# Check if INSTALL_DIR is already in PATH
if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
  SHELL_NAME="$(basename "${SHELL:-/bin/sh}")"

  case "$SHELL_NAME" in
    bash)
      if [ "$(uname -s)" = "Darwin" ]; then
        SHELL_CONFIG="$HOME/.bash_profile"
      else
        SHELL_CONFIG="$HOME/.bashrc"
      fi
      add_to_path "$SHELL_CONFIG" "export PATH=\"$INSTALL_DIR:\$PATH\""
      ;;
    zsh)
      SHELL_CONFIG="${ZDOTDIR:-$HOME}/.zshrc"
      add_to_path "$SHELL_CONFIG" "export PATH=\"$INSTALL_DIR:\$PATH\""
      ;;
    fish)
      SHELL_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/fish/conf.d/outlit.fish"
      mkdir -p "$(dirname "$SHELL_CONFIG")"
      add_to_path "$SHELL_CONFIG" "fish_add_path $INSTALL_DIR"
      ;;
    *)
      SHELL_CONFIG="$HOME/.profile"
      add_to_path "$SHELL_CONFIG" "export PATH=\"$INSTALL_DIR:\$PATH\""
      ;;
  esac

  # Update current session so verification works
  export PATH="$INSTALL_DIR:$PATH"
  MODIFIED_SHELL_CONFIG="$SHELL_CONFIG"
fi

# --- Verify ---
INSTALLED_VERSION=$("${INSTALL_DIR}/${BINARY_NAME}" --version 2>/dev/null || echo "unknown")
echo ""
success "Outlit CLI installed successfully!"
printf "  ${DIM}version:  ${RESET}%s\n" "$INSTALLED_VERSION"
printf "  ${DIM}location: ${RESET}%s\n" "${INSTALL_DIR}/${BINARY_NAME}"
echo ""

if [ -n "${MODIFIED_SHELL_CONFIG:-}" ]; then
  printf "${DIM}Added ${INSTALL_DIR} to PATH in ${MODIFIED_SHELL_CONFIG}${RESET}\n"
  printf "${DIM}Restart your terminal or run:${RESET} source %s\n" "$MODIFIED_SHELL_CONFIG"
  echo ""
fi

info "Next steps:"
printf "  1. Run ${CYAN}outlit auth login${RESET} to authenticate\n"
printf "  2. Run ${CYAN}outlit setup${RESET} to configure your AI agents\n"
echo ""
