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

BASE_URL="https://www.calicat.cn/cli"
INSTALL_ROOT="${CALICAT_CLI_INSTALL_DIR:-$HOME/.calicat-cli}"
BIN_DIR="${CALICAT_CLI_BIN_DIR:-$HOME/.local/bin}"
TMP_DIR="$(mktemp -d)"
MANIFEST_URL="$BASE_URL/latest.json"

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

log() {
  printf '[Calicat CLI] %s\n' "$1"
}

require_cmd() {
  if ! command -v "$1" >/dev/null 2>&1; then
    echo "Missing required command: $1" >&2
    exit 1
  fi
}

require_cmd curl
require_cmd tar
checksum_file() {
  if command -v shasum >/dev/null 2>&1; then
    shasum -a 256 "$1" | awk '{print $1}'
    return
  fi
  if command -v sha256sum >/dev/null 2>&1; then
    sha256sum "$1" | awk '{print $1}'
    return
  fi
  echo "Missing checksum tool: shasum or sha256sum" >&2
  exit 1
}

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

case "$OS/$ARCH" in
  Darwin/arm64) PLATFORM_KEY="darwin-arm64" ;;
  Darwin/x86_64) PLATFORM_KEY="darwin-x64" ;;
  Linux/x86_64) PLATFORM_KEY="linux-x64" ;;
  *)
    echo "Unsupported platform: $OS/$ARCH" >&2
    exit 1
    ;;
esac

log "Platform detected: $PLATFORM_KEY"
log "Install root: $INSTALL_ROOT"

mkdir -p "$INSTALL_ROOT" "$BIN_DIR" "$INSTALL_ROOT/versions"

MANIFEST_PATH="$TMP_DIR/latest.json"
log "Fetching release manifest..."
curl -#fSL "$MANIFEST_URL" -o "$MANIFEST_PATH"
VERSION="$(sed -n 's/.*"version": "\([^"]*\)".*/\1/p' "$MANIFEST_PATH" | head -n 1)"
ARCHIVE_NAME="$(awk -v key="$PLATFORM_KEY" '
  $0 ~ "\"" key "\"" { inblock=1; next }
  inblock && /"file":/ { gsub(/[",]/, "", $2); print $2; exit }
  inblock && /}/ { inblock=0 }
' "$MANIFEST_PATH")"
ARCHIVE_SHA="$(awk -v key="$PLATFORM_KEY" '
  $0 ~ "\"" key "\"" { inblock=1; next }
  inblock && /"sha256":/ { gsub(/[",]/, "", $2); print $2; exit }
  inblock && /}/ { inblock=0 }
' "$MANIFEST_PATH")"
EXECUTABLE_NAME="$(awk -v key="$PLATFORM_KEY" '
  $0 ~ "\"" key "\"" { inblock=1; next }
  inblock && /"executable":/ { gsub(/[",]/, "", $2); print $2; exit }
  inblock && /}/ { inblock=0 }
' "$MANIFEST_PATH")"

ARCHIVE_URL="$BASE_URL/$ARCHIVE_NAME"
ARCHIVE_PATH="$TMP_DIR/$ARCHIVE_NAME"
VERSION_DIR="$INSTALL_ROOT/versions/$VERSION"
PACKAGE_DIR="$TMP_DIR/calicat-cli-$VERSION-$PLATFORM_KEY"

log "Downloading Calicat CLI $VERSION for $PLATFORM_KEY..."
curl -#fSL "$ARCHIVE_URL" -o "$ARCHIVE_PATH"
log "Verifying checksum..."
ACTUAL_SHA="$(checksum_file "$ARCHIVE_PATH")"
if [[ "$ACTUAL_SHA" != "$ARCHIVE_SHA" ]]; then
  echo "Checksum mismatch for $ARCHIVE_NAME" >&2
  exit 1
fi

log "Installing binary..."
rm -rf "$VERSION_DIR"
tar -xzf "$ARCHIVE_PATH" -C "$TMP_DIR"
mv "$PACKAGE_DIR" "$VERSION_DIR"

ln -sfn "$VERSION_DIR" "$INSTALL_ROOT/current"
ln -sfn "$INSTALL_ROOT/current/$EXECUTABLE_NAME" "$BIN_DIR/calicat"
chmod +x "$INSTALL_ROOT/current/$EXECUTABLE_NAME"

case ":$PATH:" in
  *":$BIN_DIR:"*) ;;
  *)
    echo "Calicat CLI installed, but $BIN_DIR is not in PATH." >&2
    echo "Add this line to your shell profile:" >&2
    echo "  export PATH=\"$BIN_DIR:$PATH\"" >&2
    ;;
esac

log "Calicat CLI $VERSION installed."
log "Run: calicat --help"
