#!/usr/bin/env bash
# Dataline CLI installer.
#
# Usage:
#   curl -fsSL https://web.test.dataline.xyz/install.sh | \
#     DATALINE_BASE_URL=https://web.test.dataline.xyz \
#     DATALINE_RELEASE_API_URL=https://control-api.test.dataline.xyz bash
#
# Environment overrides:
#   DATALINE_INSTALL_DIR   target dir for the binary (default: ~/.local/bin)
#   DATALINE_BASE_URL      default public base URL written to local CLI env
#   DATALINE_RELEASE_API_URL  control-api URL queried for CLI release metadata
#   DATALINE_RELEASE_CHANNEL  release channel (default: stable)
#   DATALINE_ISSUER        OAuth issuer written to local CLI env
#   DATALINE_DATA_API_URL  data-api URL written to local CLI env
#   DATALINE_SKIP_SKILL    set to 1 to skip auto-running `dataline init`
set -euo pipefail

BASE_URL="${DATALINE_BASE_URL:-https://dataline.dev}"
ISSUER_URL="${DATALINE_ISSUER:-$BASE_URL}"
DATA_API_URL="${DATALINE_DATA_API_URL:-$BASE_URL}"
RELEASE_API_URL="${DATALINE_RELEASE_API_URL:-$ISSUER_URL}"
RELEASE_CHANNEL="${DATALINE_RELEASE_CHANNEL:-stable}"
INSTALL_DIR="${DATALINE_INSTALL_DIR:-$HOME/.local/bin}"
SKIP_SKILL="${DATALINE_SKIP_SKILL:-0}"

say() { printf '\033[1;36m▸\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m!\033[0m %s\n' "$*" >&2; }
die() { printf '\033[1;31m✗\033[0m %s\n' "$*" >&2; exit 1; }

uname_s="$(uname -s)"
uname_m="$(uname -m)"

case "$uname_s" in
  Darwin) os=darwin ;;
  Linux)  os=linux ;;
  MINGW*|MSYS*|CYGWIN*) os=windows ;;
  *) die "unsupported OS: $uname_s" ;;
esac

case "$uname_m" in
  arm64|aarch64) arch=arm64 ;;
  x86_64|amd64)  arch=amd64 ;;
  *) die "unsupported arch: $uname_m" ;;
esac

asset="dataline-${os}-${arch}"
install_name="dataline"
if [ "$os" = "windows" ]; then
  asset="${asset}.exe"
  install_name="dataline.exe"
fi
manifest_url="${RELEASE_API_URL%/}/v1/cli/releases/latest/manifest.txt?channel=${RELEASE_CHANNEL}&os=${os}&arch=${arch}"

manifest_tmp="$(mktemp)"
if ! curl -fsSL -H 'ngrok-skip-browser-warning: 1' -o "$manifest_tmp" "$manifest_url"; then
  rm -f "$manifest_tmp"
  die "could not fetch CLI release metadata from $manifest_url"
fi
version="$(sed -n 's/^version=//p' "$manifest_tmp" | tail -n 1)"
url="$(sed -n 's/^url=//p' "$manifest_tmp" | tail -n 1)"
expected_sha="$(awk -F= '$1 == "sha256" {print $2}' "$manifest_tmp" | tail -n 1)"
expected_size="$(awk -F= '$1 == "size_bytes" {print $2}' "$manifest_tmp" | tail -n 1)"
rm -f "$manifest_tmp"

if [ -z "$url" ] || [ -z "$expected_sha" ]; then
  die "release metadata is incomplete for $asset"
fi

say "downloading $url"
mkdir -p "$INSTALL_DIR"
tmp="$(mktemp)"
# ngrok-skip-browser-warning bypasses the free-tier interstitial for non-browser UAs.
if ! curl -fsSL -H 'ngrok-skip-browser-warning: 1' -o "$tmp" "$url"; then
  die "failed to download $url"
fi

if command -v sha256sum >/dev/null 2>&1; then
  actual_sha="$(sha256sum "$tmp" | awk '{print $1}')"
elif command -v shasum >/dev/null 2>&1; then
  actual_sha="$(shasum -a 256 "$tmp" | awk '{print $1}')"
else
  rm -f "$tmp"
  die "no sha256 tool found; cannot verify $asset"
fi
if [ "$actual_sha" != "$expected_sha" ]; then
  rm -f "$tmp"
  die "checksum mismatch for $asset"
fi
if [ -n "$expected_size" ]; then
  actual_size="$(wc -c <"$tmp" | tr -d ' ')"
  if [ "$actual_size" != "$expected_size" ]; then
    rm -f "$tmp"
    die "size mismatch for $asset"
  fi
fi
say "verified ${asset}${version:+ (${version})}"

chmod +x "$tmp"
mv "$tmp" "$INSTALL_DIR/$install_name"
say "installed $INSTALL_DIR/$install_name"

config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/dataline"
mkdir -p "$config_dir"
cat >"$config_dir/env" <<EOF
# Written by Dataline install.sh. Shell env vars still take precedence.
DATALINE_BASE_URL=${BASE_URL}
DATALINE_ISSUER=${ISSUER_URL}
DATALINE_DATA_API_URL=${DATA_API_URL}
DATALINE_RELEASE_API_URL=${RELEASE_API_URL}
DATALINE_RELEASE_CHANNEL=${RELEASE_CHANNEL}
EOF
chmod 600 "$config_dir/env"
say "wrote CLI endpoint defaults to $config_dir/env"

case ":$PATH:" in
  *":$INSTALL_DIR:"*) ;;
  *) printf '\033[1;33m!\033[0m %s is not on your PATH. Add: export PATH="%s:$PATH"\n' "$INSTALL_DIR" "$INSTALL_DIR" ;;
esac

if [ "$SKIP_SKILL" != "1" ]; then
  say "installing bundled skills (use DATALINE_SKIP_SKILL=1 to disable)"
  "$INSTALL_DIR/$install_name" init || true
fi

cat <<EOF

Next steps:
  1. dataline auth login        # browser OAuth, ~30 seconds
  2. dataline crypto price BTC  # smoke test
  3. dataline --help            # explore commands

To check for updates: dataline version --check
To uninstall: curl -fsSL ${BASE_URL}/uninstall.sh | bash
EOF
