#!/usr/bin/env bash
# prep-consumer.sh — Pack @bytelyst/* packages as tarballs and rewrite
# a consumer's package.json file: refs so builds are fully self-contained.
#
# This script lives in learning_ai_common_plat and can be called by any
# consumer repo that uses file: refs to @bytelyst/* packages.
#
# Usage:
#   ../learning_ai_common_plat/scripts/prep-consumer.sh <target-dir>
#   ../learning_ai_common_plat/scripts/prep-consumer.sh <target-dir> --restore
#
# Prerequisites:
#   cd learning_ai_common_plat && pnpm build
#
# Example:
#   # From learning_voice_ai_agent:
#   ../learning_ai_common_plat/scripts/prep-consumer.sh user-dashboard-web
#
#   # From learning_ai_clock:
#   ../learning_ai_common_plat/scripts/prep-consumer.sh web
#
#   # Restore original package.json:
#   ../learning_ai_common_plat/scripts/prep-consumer.sh user-dashboard-web --restore
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
COMMON_PLAT="$(cd "$SCRIPT_DIR/.." && pwd)"

if [ $# -lt 1 ]; then
  echo "Usage: $0 <target-dir> [--restore]"
  echo "  target-dir: path to consumer directory containing package.json"
  exit 1
fi

TARGET_DIR="$1"

# Resolve relative paths
if [[ ! "$TARGET_DIR" = /* ]]; then
  TARGET_DIR="$(pwd)/$TARGET_DIR"
fi

if [ ! -f "$TARGET_DIR/package.json" ]; then
  echo "❌ No package.json found at $TARGET_DIR"
  exit 1
fi

# ── Restore mode ──────────────────────────────────────────────
if [[ "${2:-}" == "--restore" ]]; then
  BACKUP="$TARGET_DIR/package.json.bak"
  if [ -f "$BACKUP" ]; then
    mv "$BACKUP" "$TARGET_DIR/package.json"
    rm -rf "$TARGET_DIR/.docker-deps"
    echo "✅ Restored $TARGET_DIR/package.json"
  else
    echo "⚠️  No backup found at $BACKUP"
  fi
  exit 0
fi

# ── Validate packages are built ──────────────────────────────
if [ ! -d "$COMMON_PLAT/packages" ]; then
  echo "❌ Cannot find packages/ in $COMMON_PLAT"
  exit 1
fi

# ── Pack + rewrite ────────────────────────────────────────────
DEPS_DIR="$TARGET_DIR/.docker-deps"
rm -rf "$DEPS_DIR"
mkdir -p "$DEPS_DIR"

# Back up original package.json
cp "$TARGET_DIR/package.json" "$TARGET_DIR/package.json.bak"

DIRNAME="$(basename "$TARGET_DIR")"
echo "📦 Prepping $DIRNAME..."

# Find all @bytelyst/* file: refs in package.json
PKGS=$(grep -oE '"@bytelyst/[^"]+": *"file:[^"]+"' "$TARGET_DIR/package.json" | grep -oE '@bytelyst/[^"]+' || true)

if [ -z "$PKGS" ]; then
  echo "  ℹ️  No @bytelyst/* file: refs found — nothing to do"
  rm -f "$TARGET_DIR/package.json.bak"
  rm -rf "$DEPS_DIR"
  exit 0
fi

COUNT=0
for scoped_name in $PKGS; do
  pkg_short="${scoped_name#@bytelyst/}"
  PKG_DIR="$COMMON_PLAT/packages/$pkg_short"

  if [ ! -d "$PKG_DIR" ]; then
    echo "  ⚠️  Package $pkg_short not found in $COMMON_PLAT/packages/"
    continue
  fi

  if [ ! -d "$PKG_DIR/dist" ]; then
    echo "  ⚠️  $pkg_short has no dist/ — run 'pnpm build' in common plat first"
    continue
  fi

  # Pack the package into a tarball
  TARBALL=$(cd "$PKG_DIR" && npm pack --pack-destination "$DEPS_DIR" 2>/dev/null | tail -1)
  echo "  📦 $pkg_short → $TARBALL"

  # Rewrite the file: ref in package.json to point to the local tarball
  sed -i.tmp "s|\"${scoped_name}\": *\"file:[^\"]*\"|\"${scoped_name}\": \"file:.docker-deps/${TARBALL}\"|" "$TARGET_DIR/package.json"
  rm -f "$TARGET_DIR/package.json.tmp"
  COUNT=$((COUNT + 1))
done

echo "  ✅ $DIRNAME ready ($COUNT tarballs in .docker-deps/)"
echo ""
echo "  Restore with: $0 $1 --restore"
