#!/bin/sh
# Attune one-line bootstrap: prefer registry pull, else download image tar; then interactive install.sh
# Usage: curl -fsSL https://www.2222503.xyz/install-docker.sh | sudo sh
set -eu

SITE="${ATTUNE_SITE:-https://www.2222503.xyz}"
VERSION="${ATTUNE_VERSION:-0.6.8}"
WORKDIR="${ATTUNE_WORKDIR:-/opt/attune-client}"
MANIFEST_URL="${ATTUNE_MANIFEST_URL:-$SITE/releases/docker.json}"
DEFAULT_PULL="${ATTUNE_DEFAULT_PULL_IMAGE:-ghcr.io/da202222/attune-client:0.6.8}"

if [ "$(id -u)" -ne 0 ]; then
  echo "Run as root: curl -fsSL $SITE/install-docker.sh | sudo sh" >&2
  exit 1
fi

echo "==> Attune Docker bootstrap $VERSION"
echo "    accounts server: $SITE (DEVICE CLIENT only — no billing DB)"

need() { command -v "$1" >/dev/null 2>&1 || { echo "Missing dependency: $1" >&2; exit 1; }; }
need curl
need mkdir
need mktemp

sha256() {
  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
    echo "Need sha256sum or shasum" >&2
    exit 1
  fi
}

json_get() {
  # json_get KEY file — first string value for key
  sed -n "s/.*\"$1\"[[:space:]]*:[[:space:]]*\"\\([^\"]*\\)\".*/\\1/p" "$2" | head -1
}

TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT

echo "==> Fetching manifest $MANIFEST_URL"
curl -fsSL "$MANIFEST_URL" -o "$TMP/docker.json"

ZIP_PATH=$(json_get filename "$TMP/docker.json")
ZIP_SHA=$(json_get sha256 "$TMP/docker.json")
IMG_PATH=$(json_get image "$TMP/docker.json")
IMG_SHA=$(json_get image_sha256 "$TMP/docker.json")
PULL_IMAGE=$(json_get pull_image "$TMP/docker.json")
VER=$(json_get version "$TMP/docker.json")
[ -n "$VER" ] && VERSION=$VER
[ -z "$PULL_IMAGE" ] && PULL_IMAGE=$DEFAULT_PULL

[ -n "$ZIP_PATH" ] || ZIP_PATH="docker/${VERSION}/Attune-Docker-${VERSION}.zip"
[ -n "$IMG_PATH" ] || IMG_PATH="docker/${VERSION}/attune-client-${VERSION}-linux-amd64.tar.gz"

ZIP_URL="$SITE/releases/$ZIP_PATH"
IMG_URL="$SITE/releases/$IMG_PATH"

need unzip
mkdir -p "$WORKDIR"
rm -rf "$WORKDIR/bundle"
mkdir -p "$WORKDIR/bundle"

echo "==> Downloading package zip"
echo "    $ZIP_URL"
curl -fL --progress-bar "$ZIP_URL" -o "$TMP/pkg.zip"
if [ -n "$ZIP_SHA" ]; then
  GOT=$(sha256 "$TMP/pkg.zip")
  [ "$GOT" = "$ZIP_SHA" ] || { echo "Zip SHA-256 mismatch: $GOT != $ZIP_SHA" >&2; exit 1; }
  echo "    zip checksum OK"
fi

unzip -q "$TMP/pkg.zip" -d "$WORKDIR/bundle"
PKG_DIR=$(find "$WORKDIR/bundle" -maxdepth 2 -type f -name install.sh | head -1 | xargs dirname)
[ -n "$PKG_DIR" ] && [ -d "$PKG_DIR" ] || { echo "install.sh not found in zip" >&2; exit 1; }

export ATTUNE_VERSION="$VERSION"
export ATTUNE_SITE="$SITE"
export ATTUNE_DEFAULT_PULL_IMAGE="$PULL_IMAGE"
if [ "${ATTUNE_NONINTERACTIVE:-0}" = "1" ]; then
  export ATTUNE_NONINTERACTIVE=1
fi

# Try registry pull first when Docker is available; else download tar next to install.sh
SKIP_TAR=0
if command -v docker >/dev/null 2>&1; then
  echo "==> Trying registry pull: $PULL_IMAGE"
  if docker pull "$PULL_IMAGE"; then
    docker tag "$PULL_IMAGE" "attune-client:${VERSION}" 2>/dev/null || true
    export ATTUNE_PULL_IMAGE="$PULL_IMAGE"
    SKIP_TAR=1
    echo "    pull OK — skipping image tar download"
  else
    echo "    pull failed — will download image tar"
  fi
fi

if [ "$SKIP_TAR" -eq 0 ]; then
  echo "==> Downloading image tar"
  echo "    $IMG_URL"
  curl -fL --progress-bar "$IMG_URL" -o "$TMP/image.tar.gz"
  if [ -n "$IMG_SHA" ]; then
    GOT=$(sha256 "$TMP/image.tar.gz")
    [ "$GOT" = "$IMG_SHA" ] || { echo "Image SHA-256 mismatch" >&2; exit 1; }
    echo "    image checksum OK"
  fi
  cp -f "$TMP/image.tar.gz" "$PKG_DIR/attune-client-${VERSION}-linux-amd64.tar.gz"
fi

echo "==> Installing into $PKG_DIR"
cd "$PKG_DIR"
sh ./install.sh
