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

VERSION="${ARRIVALCLI_VERSION:-0.1.2}"
BASE_URL="${ARRIVALCLI_BASE_URL:-https://43.108.15.8/arrivalcli}"
WHEEL_FILE="arrivalcli-${VERSION}-py3-none-any.whl"
WHEEL_URL="${ARRIVALCLI_WHEEL_URL:-${BASE_URL}/${WHEEL_FILE}}"

AUTO_INIT=0
AUTO_SETUP_CLAUDE=0
FORCE_SETUP_CLAUDE=0
SKILLS_DIR=""
CONFIG_BASE_URL=""
CONFIG_API_KEY=""

log() {
  printf '%s\n' "$*"
}

fail() {
  printf 'ERROR: %s\n' "$*" >&2
  exit 1
}

usage() {
  cat <<EOF
ArrivalCLI installer

Usage:
  curl -fsSL ${BASE_URL}/install.sh | bash

Optional flags:
  --init                 Install after running arrivalcli init
  --setup-claude         Install the Claude Code skill after installation
  --force                Use with --setup-claude to overwrite existing skill
  --skills-dir PATH      Explicit Claude Code skills directory
  --base-url URL         Write base_url into ~/.arrivalcli/config.json
  --api-key KEY          Write api_key into ~/.arrivalcli/config.json
  --wheel-url URL        Override wheel download URL
  --version VERSION      Override wheel version
  --help                 Show this help

Examples:
  curl -fsSL ${BASE_URL}/install.sh | bash
  curl -fsSL ${BASE_URL}/install.sh | bash -s -- --init
  curl -fsSL ${BASE_URL}/install.sh | bash -s -- --init --base-url http://example.com:9527 --api-key your-key
  curl -fsSL ${BASE_URL}/install.sh | bash -s -- --setup-claude --force
EOF
}

require_cmd() {
  command -v "$1" >/dev/null 2>&1 || fail "缺少命令: $1"
}

download_with_curl() {
  local url="$1"
  local output="$2"
  curl -fsSL "$url" -o "$output"
}

download_with_wget() {
  local url="$1"
  local output="$2"
  wget -qO "$output" "$url"
}

download_file() {
  local url="$1"
  local output="$2"

  if command -v curl >/dev/null 2>&1; then
    download_with_curl "$url" "$output"
    return
  fi

  if command -v wget >/dev/null 2>&1; then
    download_with_wget "$url" "$output"
    return
  fi

  fail "当前环境既没有 curl，也没有 wget，无法下载安装包"
}

detect_python() {
  if command -v python3 >/dev/null 2>&1; then
    printf '%s\n' "python3"
    return
  fi

  if command -v python >/dev/null 2>&1; then
    printf '%s\n' "python"
    return
  fi

  fail "当前机器未找到 Python，请先安装 Python 3"
}

update_config() {
  local python_bin="$1"

  if [[ -z "$CONFIG_BASE_URL" && -z "$CONFIG_API_KEY" ]]; then
    return
  fi

  "$python_bin" - <<PY
import json
import os
from pathlib import Path

config_path = Path.home() / ".arrivalcli" / "config.json"
if not config_path.exists():
    raise SystemExit("配置文件不存在，请先执行 arrivalcli init")

data = json.loads(config_path.read_text(encoding="utf-8"))
base_url = ${CONFIG_BASE_URL@Q}
api_key = ${CONFIG_API_KEY@Q}
if base_url:
    data["base_url"] = base_url
if api_key:
    data["api_key"] = api_key
config_path.write_text(json.dumps(data, ensure_ascii=False, indent=2) + "\\n", encoding="utf-8")
print(f"updated {config_path}")
PY
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    --init)
      AUTO_INIT=1
      shift
      ;;
    --setup-claude)
      AUTO_SETUP_CLAUDE=1
      shift
      ;;
    --force)
      FORCE_SETUP_CLAUDE=1
      shift
      ;;
    --skills-dir)
      SKILLS_DIR="${2:-}"
      [[ -n "$SKILLS_DIR" ]] || fail "--skills-dir 需要指定路径"
      shift 2
      ;;
    --base-url)
      CONFIG_BASE_URL="${2:-}"
      [[ -n "$CONFIG_BASE_URL" ]] || fail "--base-url 需要指定值"
      shift 2
      ;;
    --api-key)
      CONFIG_API_KEY="${2:-}"
      [[ -n "$CONFIG_API_KEY" ]] || fail "--api-key 需要指定值"
      shift 2
      ;;
    --wheel-url)
      WHEEL_URL="${2:-}"
      [[ -n "$WHEEL_URL" ]] || fail "--wheel-url 需要指定值"
      shift 2
      ;;
    --version)
      VERSION="${2:-}"
      [[ -n "$VERSION" ]] || fail "--version 需要指定值"
      WHEEL_FILE="arrivalcli-${VERSION}-py3-none-any.whl"
      shift 2
      ;;
    --help|-h)
      usage
      exit 0
      ;;
    *)
      fail "未知参数: $1"
      ;;
  esac
done

PYTHON_BIN="$(detect_python)"
require_cmd "$PYTHON_BIN"

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

log "Downloading $WHEEL_URL"
download_file "$WHEEL_URL" "$WHEEL_PATH"

log "Installing $WHEEL_FILE"
"$PYTHON_BIN" -m pip install --user --upgrade "$WHEEL_PATH"

USER_BASE="$("$PYTHON_BIN" -m site --user-base)"
ARRIVALCLI_BIN="$USER_BASE/bin/arrivalcli"

[[ -x "$ARRIVALCLI_BIN" ]] || fail "安装完成后未找到 arrivalcli: $ARRIVALCLI_BIN"

log ""
log "Installed: $ARRIVALCLI_BIN"
log ""

if [[ $AUTO_INIT -eq 1 ]]; then
  log "Running arrivalcli init"
  "$ARRIVALCLI_BIN" init
fi

update_config "$PYTHON_BIN"

if [[ $AUTO_SETUP_CLAUDE -eq 1 ]]; then
  log "Installing Claude Code skill"
  CLAUDE_ARGS=(setup-claude --cli-command "$ARRIVALCLI_BIN")
  if [[ -n "$SKILLS_DIR" ]]; then
    CLAUDE_ARGS+=(--skills-dir "$SKILLS_DIR")
  fi
  if [[ $FORCE_SETUP_CLAUDE -eq 1 ]]; then
    CLAUDE_ARGS+=(--force)
  fi
  "$ARRIVALCLI_BIN" "${CLAUDE_ARGS[@]}"
fi

log "Next steps:"
log "1. Ensure PATH includes: $USER_BASE/bin"
log "   Example: export PATH=\"$USER_BASE/bin:\$PATH\""
log "2. Validate installation:"
log "   $ARRIVALCLI_BIN --help"
log "3. Initialize config if not already done:"
log "   $ARRIVALCLI_BIN init"
log "4. View config:"
log "   $ARRIVALCLI_BIN config show"
log "5. Install Claude Code skill when ready:"
log "   $ARRIVALCLI_BIN setup-claude"
