#!/usr/bin/env bash
# Validates workspace package registration across CI infrastructure:
#   1. Main Dockerfile has all workspace packages (except those with own Dockerfiles)
#   2. Service-specific Dockerfiles include all workspace dependencies
#   3. DDTRACE_ADDONS ARG is consistent across all Dockerfiles and docker-bake.hcl
set -euo pipefail

ERRORS=0
ROOT="$(git rev-parse --show-toplevel)"

# Discover workspace packages from the filesystem
PACKAGES=()
for dir in "$ROOT"/apps/*/package.json "$ROOT"/packages/*/package.json; do
  [ -f "$dir" ] || continue
  rel=$(echo "$dir" | sed "s|^$ROOT/||; s|/package.json$||")
  PACKAGES+=("$rel")
done

echo "Discovered ${#PACKAGES[@]} workspace packages"

# ── Check 1: Main Dockerfile COPY stanzas ────────────────────────────
# Packages with their own Dockerfile are exempt.
echo ""
echo "Checking main Dockerfile..."
for pkg in "${PACKAGES[@]}"; do
  # Skip packages with their own Dockerfile(s) — they don't use the main Dockerfile
  if compgen -G "$ROOT/$pkg/Dockerfile" -G "$ROOT/$pkg/Dockerfile.*" > /dev/null 2>&1; then
    continue
  fi
  if ! grep -q "$pkg/" "$ROOT/Dockerfile" 2>/dev/null; then
    echo "  MISSING: $pkg not found in Dockerfile"
    ERRORS=$((ERRORS + 1))
  fi
done

# ── Check 2: Service Dockerfiles include workspace dependencies ──────
echo ""
echo "Checking service-specific Dockerfiles..."
for app_dir in "$ROOT"/apps/*/; do
  dockerfile="$app_dir/Dockerfile"
  [ -f "$dockerfile" ] || continue
  app_name=$(basename "$app_dir")

  # Read @coda/* dependencies and resolve to directory paths
  # Resolve @coda/* deps to directory paths (could be packages/ or apps/)
  deps=$(node -e "
    const fs = require('fs'), path = require('path');
    const pj = require('${app_dir}package.json');
    const deps = {...pj.dependencies, ...pj.devDependencies};
    Object.keys(deps).filter(d => d.startsWith('@coda/')).forEach(d => {
      const name = d.replace('@coda/', '');
      if (fs.existsSync(path.join('packages', name, 'package.json'))) console.log('packages/' + name);
      else if (fs.existsSync(path.join('apps', name, 'package.json'))) console.log('apps/' + name);
    });
  " 2>/dev/null) || true

  for dep_dir in $deps; do
    if [ -d "$ROOT/$dep_dir" ] && ! grep -q "$dep_dir/" "$dockerfile" 2>/dev/null; then
      echo "  MISSING: $dep_dir not in apps/$app_name/Dockerfile"
      ERRORS=$((ERRORS + 1))
    fi
  done
done

# ── Check 3: DDTRACE_ADDONS consistency ──────────────────────────────
echo ""
echo "Checking DDTRACE_ADDONS consistency..."
BAKE_ADDONS=$(grep -A1 'variable "DDTRACE_ADDONS"' "$ROOT/docker-bake.hcl" 2>/dev/null | sed -n 's/.*default = "\([^"]*\)"/\1/p')
if [ -n "$BAKE_ADDONS" ]; then
  for df in "$ROOT/Dockerfile" "$ROOT/apps/runner/Dockerfile" "$ROOT/apps/search/Dockerfile"; do
    [ -f "$df" ] || continue
    DF_ADDONS=$(sed -n 's/.*DDTRACE_ADDONS="\([^"]*\)"/\1/p' "$df" | head -1)
    if [ -n "$DF_ADDONS" ] && [ "$DF_ADDONS" != "$BAKE_ADDONS" ]; then
      rel=$(echo "$df" | sed "s|^$ROOT/||")
      echo "  MISMATCH: $rel DDTRACE_ADDONS differs from docker-bake.hcl"
      ERRORS=$((ERRORS + 1))
    fi
  done
fi

# ── Summary ──────────────────────────────────────────────────────────
echo ""
if [ "$ERRORS" -gt 0 ]; then
  echo "FAIL: $ERRORS workspace sync issue(s) found"
  exit 1
else
  echo "OK: all checks passed"
fi
