#!/usr/bin/env bash
# bb-inject — Inject BlackBoard v2 beacon across all BlackRoad web properties
# Usage: bb-inject [--dry-run] [--site dir1 dir2 ...]

set -e

PINK='\033[38;5;205m'
AMBER='\033[38;5;214m'
GREEN='\033[38;5;82m'
BLUE='\033[38;5;69m'
VIOLET='\033[38;5;135m'
RED='\033[38;5;196m'
RESET='\033[0m'

BEACON='<script src="https://bb.blackroad.io/bb.js" defer></script>'
BEACON_PATTERN='bb\.blackroad\.io/bb\.js'
DRY_RUN=false
INJECTED=0
SKIPPED=0
ALREADY=0

if [[ "${1:-}" == "--dry-run" ]]; then
  DRY_RUN=true
  shift
  echo -e "${AMBER}[DRY RUN]${RESET} No files will be modified"
fi

# All known Pages project directories
SITES=(
  "$HOME/blackroad-web"
  "$HOME/index-blackroad"
  "$HOME/portal-blackroad"
  "$HOME/chat-blackroad"
  "$HOME/images-blackroad"
  "$HOME/thinking.blackroad.io"
  "$HOME/blackroad-operator/dashboard"
  "$HOME/blackroad-operator/websites"
  "$HOME/blackroad-operator/workers/blackboard/public"
  "$HOME/blackroad-operator/workers/mesh/public"
  "$HOME/blackroad-operator/orgs"
  "$HOME/blackroad-operator/packages"
  "$HOME/Desktop/templates"
)

# If specific sites provided, use those instead
if [[ $# -gt 0 ]]; then
  SITES=("$@")
fi

echo -e "${PINK}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
echo -e "${PINK}  BlackBoard v2 — Beacon Injection${RESET}"
echo -e "${PINK}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
echo ""

inject_file() {
  local file="$1"
  local rel="${file#$HOME/}"

  # Skip miniflare/wrangler dev tool HTML
  if [[ "$file" == *"node_modules"* ]] || [[ "$file" == *".git/"* ]]; then
    return
  fi

  # Check if already has beacon
  if grep -q "$BEACON_PATTERN" "$file" 2>/dev/null; then
    echo -e "  ${BLUE}✓${RESET} $rel ${BLUE}(already has beacon)${RESET}"
    ((ALREADY++)) || true
    return
  fi

  # Check if it has a </head> tag to inject before
  if grep -q '</head>' "$file" 2>/dev/null; then
    if $DRY_RUN; then
      echo -e "  ${AMBER}→${RESET} $rel ${AMBER}(would inject before </head>)${RESET}"
    else
      # Inject before </head> — use perl for reliable newline handling on macOS
      perl -pi -e "s|</head>|${BEACON}\n</head>|" "$file"
      echo -e "  ${GREEN}✓${RESET} $rel ${GREEN}(injected before </head>)${RESET}"
    fi
    ((INJECTED++)) || true
    return
  fi

  # Check if it has </body>
  if grep -q '</body>' "$file" 2>/dev/null; then
    if $DRY_RUN; then
      echo -e "  ${AMBER}→${RESET} $rel ${AMBER}(would inject before </body>)${RESET}"
    else
      perl -pi -e "s|</body>|${BEACON}\n</body>|" "$file"
      echo -e "  ${GREEN}✓${RESET} $rel ${GREEN}(injected before </body>)${RESET}"
    fi
    ((INJECTED++)) || true
    return
  fi

  echo -e "  ${RED}✗${RESET} $rel ${RED}(no head/body tag found)${RESET}"
  ((SKIPPED++)) || true
}

for site_dir in "${SITES[@]}"; do
  if [[ ! -d "$site_dir" ]]; then
    continue
  fi

  echo -e "\n${VIOLET}▸ Scanning: ${site_dir#$HOME/}${RESET}"

  # Find all HTML files, excluding node_modules and .git
  while IFS= read -r file; do
    [[ -z "$file" ]] && continue
    inject_file "$file"
  done < <(find "$site_dir" -name "*.html" -not -path "*/node_modules/*" -not -path "*/.git/*" 2>/dev/null | sort)
done

echo ""
echo -e "${PINK}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
echo -e "  ${GREEN}Injected:${RESET} $INJECTED files"
echo -e "  ${BLUE}Already:${RESET}  $ALREADY files"
echo -e "  ${RED}Skipped:${RESET}  $SKIPPED files"
echo -e "${PINK}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"

if $DRY_RUN; then
  echo -e "\n${AMBER}Run without --dry-run to apply changes${RESET}"
fi
