#!/usr/bin/env bash
# check-arda-prerequisites.sh — Checks prerequisites for running the arda
# webapp from the Bigscreen cloud repo. Reports only; does NOT install.
#
# Cloud repo detection order:
#   1. CLOUD_DIR env var (explicit override)
#   2. Walk up from cwd (matches when we're inside the repo or a subdirectory)
#   3. Check for a ./cloud subdirectory of cwd
#   4. If not found, exit with an error — the skill handles user interaction

set -uo pipefail

PASS="[OK]"
FAIL="[MISSING]"
WARN="[WARNING]"

_is_cloud_repo() {
  local d="$1"
  [ -n "$d" ] \
    && [ -f "$d/package.json" ] \
    && [ -d "$d/webapps/arda" ] \
    && grep -q '"name".*"bigscreen"' "$d/package.json" 2>/dev/null
}

detect_cloud_dir() {
  # 1. Explicit override
  if [ -n "${CLOUD_DIR:-}" ]; then
    echo "$CLOUD_DIR"
    return
  fi

  # 2. Walk up from cwd
  local dir
  dir="$(pwd)"
  while true; do
    if _is_cloud_repo "$dir"; then
      echo "$dir"
      return
    fi
    local parent
    parent="$(dirname "$dir")"
    if [ "$parent" = "$dir" ]; then
      break
    fi
    dir="$parent"
  done

  # 3. Check ./cloud subdirectory of cwd
  if _is_cloud_repo "$(pwd)/cloud"; then
    echo "$(pwd)/cloud"
    return
  fi

  # 4. No cloud repo found — return empty, let the caller handle it
  echo ""
}

CLOUD_DIR="$(detect_cloud_dir)"

echo "=========================================="
echo " Bigscreen arda — Prerequisite Check"
echo "=========================================="
echo " (check-only — nothing will be installed)"

if [ -z "$CLOUD_DIR" ]; then
  echo ""
  echo "[MISSING] Could not find the Bigscreen cloud repo."
  echo "       Detection (from: $(pwd)):"
  echo "         - CLOUD_DIR env var (not set)"
  echo "         - walking up cwd for package.json + webapps/arda (not found)"
  echo "         - ./cloud subdirectory (not found)"
  echo ""
  echo "       The skill will now ask you whether to:"
  echo "         (a) Clone the cloud repo fresh into ./cloud, or"
  echo "         (b) Provide the full path to an existing cloud repo"
  echo "=========================================="
  # Exit 2 distinguishes "no cloud repo" from "other prereqs missing"
  exit 2
fi

echo " Cloud repo: $CLOUD_DIR"
echo ""

ISSUES=0

# --- Node.js ---
echo "--- Node.js ---"
if command -v node &>/dev/null; then
  NODE_VER=$(node --version 2>/dev/null)
  NODE_MAJOR=$(echo "$NODE_VER" | sed 's/v\([0-9]*\).*/\1/')
  if [ "$NODE_MAJOR" -ge 24 ] 2>/dev/null; then
    echo "$PASS Node.js $NODE_VER"
  else
    echo "$WARN Node.js $NODE_VER (v24+ required)"
    echo "       Fix: install Node 24+ — e.g. 'volta install node@24'"
    echo "            or see https://nodejs.org/"
    ISSUES=$((ISSUES + 1))
  fi
else
  echo "$FAIL Node.js not found"
  echo "       Fix: install Node 24+ — e.g. 'volta install node@24'"
  echo "            or see https://nodejs.org/"
  ISSUES=$((ISSUES + 1))
fi
echo ""

# --- Yarn ---
echo "--- Yarn ---"
if command -v yarn &>/dev/null; then
  echo "$PASS Yarn $(yarn --version 2>/dev/null)"
else
  echo "$FAIL Yarn not found"
  echo "       Fix: 'volta install yarn' (or 'npm install --global yarn')"
  ISSUES=$((ISSUES + 1))
fi
echo ""

# --- TypeScript tooling ---
echo "--- TypeScript tooling ---"
for tool in tsc ts-node; do
  if command -v "$tool" &>/dev/null; then
    echo "$PASS $tool found"
  else
    echo "$FAIL $tool not found"
    case "$tool" in
      tsc) echo "       Fix: 'volta install typescript'" ;;
      *)   echo "       Fix: 'volta install $tool'" ;;
    esac
    ISSUES=$((ISSUES + 1))
  fi
done
echo ""

# --- Webpack (global) ---
echo "--- Webpack (global) ---"
if command -v webpack &>/dev/null; then
  echo "$PASS webpack $(webpack --version 2>/dev/null | head -1)"
else
  echo "$FAIL webpack not found globally"
  echo "       Fix: 'npm install --global webpack webpack-cli'"
  ISSUES=$((ISSUES + 1))
fi
echo ""

# --- Cloud repo ---
echo "--- Cloud Repo ---"
CLOUD_OK=0
if [ -d "$CLOUD_DIR/.git" ]; then
  echo "$PASS Cloud repo found at $CLOUD_DIR"
  CLOUD_OK=1
  if [ -f "$CLOUD_DIR/package.json" ]; then
    echo "$PASS package.json present"
  else
    echo "$WARN Repo cloned but no package.json found"
    ISSUES=$((ISSUES + 1))
  fi
  if [ -d "$CLOUD_DIR/node_modules" ]; then
    echo "$PASS root node_modules present"
  else
    echo "$FAIL root node_modules missing"
    echo "       Fix: the skill will run 'yarn install' automatically"
    echo "            (do not run 'yarn run install-dev-deps' on a fresh clone"
    echo "             — it fails without node_modules first)"
    ISSUES=$((ISSUES + 1))
  fi
  # webapps/ has its own package.json + yarn.lock and is NOT part of the
  # root yarn workspaces, so its deps (incl. copy-webpack-plugin used by
  # arda's webpack.config.js) won't be installed by the root yarn install.
  if [ -f "$CLOUD_DIR/webapps/package.json" ]; then
    if [ -d "$CLOUD_DIR/webapps/node_modules" ]; then
      echo "$PASS webapps/node_modules present"
    else
      echo "$FAIL webapps/node_modules missing"
      echo "       Fix: the skill will run 'yarn install' in webapps/ automatically"
      ISSUES=$((ISSUES + 1))
    fi
  fi
else
  echo "$FAIL Cloud repo not found at $CLOUD_DIR (detected, not a git repo)"
  echo "       Fix: cd into the cloud repo and re-run, or set CLOUD_DIR"
  ISSUES=$((ISSUES + 1))
fi
echo ""

# --- arda webapp ---
echo "--- arda Webapp ---"
if [ "$CLOUD_OK" -eq 1 ]; then
  ARDA_DIR="$CLOUD_DIR/webapps/arda"
  if [ -d "$ARDA_DIR" ]; then
    echo "$PASS $ARDA_DIR exists"
    if [ -f "$ARDA_DIR/arda.js" ]; then
      echo "$PASS arda.js entrypoint present"
    else
      echo "$WARN arda.js not found at $ARDA_DIR/arda.js"
      ISSUES=$((ISSUES + 1))
    fi
    if [ -f "$ARDA_DIR/webpack.config.js" ]; then
      echo "$PASS webpack.config.js present"
    else
      echo "$WARN webpack.config.js missing at $ARDA_DIR"
      ISSUES=$((ISSUES + 1))
    fi
    if [ -f "$ARDA_DIR/.env" ]; then
      echo "$PASS webapps/arda/.env present"
    else
      echo "$FAIL webapps/arda/.env missing"
      echo "       Fix options:"
      echo "         (a) Copy from a teammate's machine (fastest)"
      echo "         (b) Generate via devops ServerEnvironmentBuilder,"
      echo "             then copy .out/webapp_arda.env to $ARDA_DIR/.env"
      ISSUES=$((ISSUES + 1))
    fi
  else
    echo "$FAIL arda webapp directory not found at $ARDA_DIR"
    echo "       The cloud repo may be at an older revision — try 'git pull'"
    ISSUES=$((ISSUES + 1))
  fi
else
  echo "$WARN Skipped — cloud repo not found"
fi
echo ""

# --- Summary ---
echo "=========================================="
if [ "$ISSUES" -eq 0 ]; then
  echo " arda is ready to run!"
  echo ""
  echo " Cloud repo: $CLOUD_DIR"
  echo " Next steps:"
  echo "   cd $CLOUD_DIR"
  echo "   yarn dev:arda-server      # terminal 1"
  echo "   yarn dev:arda-webpack     # terminal 2"
else
  echo " $ISSUES issue(s) found. See instructions above."
  echo ""
  echo " This skill does not auto-install anything — fix each item"
  echo " yourself, then ask to re-run the check."
fi
echo "=========================================="

# Print the resolved CLOUD_DIR so the skill can capture it
echo ""
echo "CLOUD_DIR=$CLOUD_DIR"

exit "$ISSUES"
