#!/usr/bin/env bash
# cue-slug — output project slug and sanitized branch for the cwd
# Usage: eval "$(cue-slug)"   → sets SLUG and BRANCH variables
# Or:    cue-slug             → prints SLUG=... and BRANCH=... lines
#
# Convention adapted from gstack/bin/gstack-slug. The slug derives from the
# git remote (so different worktrees of the same repo share a slug); falls
# back to the directory basename when no remote exists. Output is sanitized
# to [a-zA-Z0-9._-] only, safe for eval/source consumption.
set -euo pipefail

CACHE_DIR="$HOME/.cue/slug-cache"
PROJECT_DIR="$(pwd)"
CACHE_KEY=$(printf '%s' "$PROJECT_DIR" | tr '/' '_')
CACHE_FILE="${CACHE_DIR}/${CACHE_KEY}"

SLUG=""

# 1. Try cached slug first (guarantees consistency across sessions)
if [[ -f "$CACHE_FILE" ]]; then
  SLUG=$(cat "$CACHE_FILE" 2>/dev/null || true)
fi

# 2. If no cache, compute from git remote (kept out of a pipeline so pipefail
#    doesn't swallow a missing-remote error and produce an empty slug)
if [[ -z "${SLUG:-}" ]]; then
  REMOTE_URL=$(git remote get-url origin 2>/dev/null) || REMOTE_URL=""
  if [[ -n "$REMOTE_URL" ]]; then
    RAW_SLUG=$(printf '%s' "$REMOTE_URL" \
      | sed 's|.*[:/]\([^/]*/[^/]*\)\.git$|\1|;s|.*[:/]\([^/]*/[^/]*\)$|\1|' \
      | tr '/' '-')
    SLUG=$(printf '%s' "$RAW_SLUG" | tr -cd 'a-zA-Z0-9._-')
  fi
fi

# 3. Fallback to basename only when there's truly no git remote
SLUG="${SLUG:-$(basename "$PWD" | tr -cd 'a-zA-Z0-9._-')}"

# 4. Cache the slug for future sessions (atomic write, fail silently)
if [[ -n "$SLUG" ]]; then
  mkdir -p "$CACHE_DIR" 2>/dev/null || true
  CACHE_TMP=$(mktemp "$CACHE_DIR/.slug-XXXXXX" 2>/dev/null) || CACHE_TMP=""
  if [[ -n "$CACHE_TMP" ]]; then
    printf '%s' "$SLUG" > "$CACHE_TMP" \
      && mv "$CACHE_TMP" "$CACHE_FILE" 2>/dev/null \
      || rm -f "$CACHE_TMP" 2>/dev/null
  fi
fi

RAW_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) || RAW_BRANCH=""
BRANCH=$(printf '%s' "${RAW_BRANCH:-}" | tr -cd 'a-zA-Z0-9._-')
BRANCH="${BRANCH:-unknown}"

echo "SLUG=$SLUG"
echo "BRANCH=$BRANCH"
