#!/usr/bin/env bash
# check-prerequisites.sh — Checks Bigscreen cloud dev environment prerequisites
# Outputs a status report for each required component.

set -uo pipefail

PASS="[OK]"
FAIL="[MISSING]"
WARN="[WARNING]"

# Detect the WSL Ubuntu distro name (could be "Ubuntu", "Ubuntu-18.04", "Ubuntu-22.04", etc.)
detect_wsl_ubuntu() {
  if ! command -v wsl &>/dev/null; then
    echo ""
    return
  fi
  wsl --list --quiet 2>/dev/null | tr -d '\0' | tr -d '\r' | grep -i "ubuntu" | head -1
}

WSL_UBUNTU="${WSL_UBUNTU:-$(detect_wsl_ubuntu)}"

echo "=========================================="
echo " Bigscreen Cloud — Prerequisite Check"
echo "=========================================="
echo ""

ISSUES=0

# --- WSL / Ubuntu ---
echo "--- WSL / Ubuntu ---"
if command -v wsl &>/dev/null; then
  if [ -n "$WSL_UBUNTU" ]; then
    echo "$PASS WSL installed, Ubuntu distro found: $WSL_UBUNTU"

    # Check actual OS version inside the distro
    UBUNTU_VER=$(wsl -d "$WSL_UBUNTU" -- bash -c "cat /etc/os-release 2>/dev/null" 2>/dev/null | tr -d '\0' | tr -d '\r' | grep "^PRETTY_NAME=" | sed 's/PRETTY_NAME="//' | sed 's/"$//')
    if [ -n "$UBUNTU_VER" ]; then
      echo "$PASS Running: $UBUNTU_VER"
    else
      echo "$WARN Ubuntu distro exists but could not read OS version"
      ISSUES=$((ISSUES + 1))
    fi
  else
    echo "$FAIL WSL installed but no Ubuntu distro found"
    echo "       Fix: Run in Admin PowerShell: wsl --install -d Ubuntu"
    ISSUES=$((ISSUES + 1))
  fi
else
  echo "$FAIL WSL not found"
  echo "       Fix: Run in Admin PowerShell: wsl --install -d Ubuntu"
  ISSUES=$((ISSUES + 1))
fi
echo ""

# --- Volta ---
echo "--- Volta ---"
if command -v volta &>/dev/null; then
  echo "$PASS Volta $(volta --version 2>/dev/null)"
else
  echo "$FAIL Volta not found"
  echo "       Fix: Install from https://volta.sh/"
  ISSUES=$((ISSUES + 1))
fi
echo ""

# --- 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: volta install node@24"
    ISSUES=$((ISSUES + 1))
  fi
else
  echo "$FAIL Node.js not found"
  echo "       Fix: volta install node@24"
  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"
  ISSUES=$((ISSUES + 1))
fi
echo ""

# --- TypeScript / ts-node / ts-mocha ---
echo "--- TypeScript tooling ---"
for tool in tsc ts-node ts-mocha; 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 ""

# --- Python ---
echo "--- Python ---"
if command -v python &>/dev/null; then
  PY_VER=$(python --version 2>&1 | awk '{print $2}')
  if [ "$PY_VER" = "3.10.11" ]; then
    echo "$PASS Python $PY_VER"
  else
    echo "$WARN Python $PY_VER (3.10.11 required exactly)"
    echo "       Fix: Install from https://www.python.org/downloads/release/python-31011/"
    ISSUES=$((ISSUES + 1))
  fi
else
  echo "$FAIL Python not found"
  echo "       Fix: Install from https://www.python.org/downloads/release/python-31011/"
  ISSUES=$((ISSUES + 1))
fi
echo ""

# --- Redis (in WSL) ---
echo "--- Redis (WSL) ---"
if [ -n "$WSL_UBUNTU" ]; then
  REDIS_VER=$(wsl -d "$WSL_UBUNTU" -- redis-cli -v 2>/dev/null | tr -d '\0' | tr -d '\r')
  if [ -n "$REDIS_VER" ]; then
    echo "$PASS $REDIS_VER"
    REDIS_PING=$(wsl -d "$WSL_UBUNTU" -- redis-cli ping 2>/dev/null | tr -d '\0' | tr -d '\r')
    if [ "$REDIS_PING" = "PONG" ]; then
      echo "$PASS Redis is responding"
    else
      echo "$WARN Redis installed but not responding (not running?)"
      echo "       Fix: wsl -d $WSL_UBUNTU -- sudo service redis_6379 start"
      ISSUES=$((ISSUES + 1))
    fi
  else
    echo "$FAIL Redis not found in WSL/$WSL_UBUNTU"
    echo "       Fix: See cloud README.md for Redis installation steps"
    ISSUES=$((ISSUES + 1))
  fi
else
  echo "$FAIL Cannot check Redis — no WSL Ubuntu distro found"
  ISSUES=$((ISSUES + 1))
fi
echo ""

# --- PostgreSQL (in WSL) ---
echo "--- PostgreSQL (WSL) ---"
if [ -n "$WSL_UBUNTU" ]; then
  PG_VER=$(wsl -d "$WSL_UBUNTU" -- psql --version 2>/dev/null | tr -d '\0' | tr -d '\r')
  if [ -n "$PG_VER" ]; then
    echo "$PASS $PG_VER"
    # Use pg_isready (no sudo/password needed) to check if PostgreSQL is accepting connections
    PG_READY=$(wsl -d "$WSL_UBUNTU" -- pg_isready 2>/dev/null | tr -d '\0' | tr -d '\r')
    if echo "$PG_READY" | grep -q "accepting connections"; then
      echo "$PASS PostgreSQL is accepting connections"

      # Check for localv1db using peer auth (no password needed for listing)
      DB_EXISTS=$(wsl -d "$WSL_UBUNTU" -- bash -c "sudo -n -u postgres psql -lqt 2>/dev/null" 2>/dev/null | tr -d '\0' | tr -d '\r' | grep -c "localv1db" || echo "0")
      if [ "$DB_EXISTS" -gt 0 ] 2>/dev/null; then
        echo "$PASS Database 'localv1db' exists"
      else
        echo "$WARN Could not verify 'localv1db' database (may need sudo password)"
        echo "       Check manually: wsl -d $WSL_UBUNTU -- sudo -u postgres psql -l"
        ISSUES=$((ISSUES + 1))
      fi
    else
      echo "$WARN PostgreSQL installed but not accepting connections"
      echo "       Fix: wsl -d $WSL_UBUNTU -- sudo service postgresql start"
      ISSUES=$((ISSUES + 1))
    fi
  else
    echo "$FAIL PostgreSQL not found in WSL/$WSL_UBUNTU"
    echo "       Fix: See cloud README.md for PostgreSQL installation steps"
    ISSUES=$((ISSUES + 1))
  fi
else
  echo "$FAIL Cannot check PostgreSQL — no WSL Ubuntu distro found"
  ISSUES=$((ISSUES + 1))
fi
echo ""

# --- Webpack (global) ---
echo "--- Webpack ---"
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 ---"
# Allow overriding via env var for testing: CLOUD_DIR=/tmp/test-cloud bash check-prerequisites.sh
CLOUD_DIR="${CLOUD_DIR:-C:/Bigscreen/cloud}"
if [ -d "$CLOUD_DIR/.git" ]; then
  echo "$PASS Cloud repo found at $CLOUD_DIR"
  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 node_modules present"
  else
    echo "$FAIL node_modules missing — run: cd $CLOUD_DIR && yarn run install-dev-deps"
    ISSUES=$((ISSUES + 1))
  fi
else
  echo "$FAIL Cloud repo not found at $CLOUD_DIR"
  echo "       Fix: git clone https://github.com/BigscreenVR/cloud.git $CLOUD_DIR"
  ISSUES=$((ISSUES + 1))
fi
echo ""

# --- Environment files ---
echo "--- Environment Files ---"
if [ -d "$CLOUD_DIR" ]; then
  ENV_LOCATIONS=(
    "apps/admin_api/.env"
    "apps/api/.env"
    "cloud/cloud_api/.env"
    "cloud/ws_server/.env"
    "cloud/cloud_worker/.env"
    "webapps/arda/.env"
  )
  ENV_MISSING=0
  for env_path in "${ENV_LOCATIONS[@]}"; do
    full_path="$CLOUD_DIR/$env_path"
    if [ -f "$full_path" ]; then
      echo "$PASS $env_path"
    else
      echo "$FAIL $env_path"
      ENV_MISSING=$((ENV_MISSING + 1))
    fi
  done
  if [ "$ENV_MISSING" -gt 0 ]; then
    echo ""
    echo "       $ENV_MISSING env file(s) missing."
    echo "       Generate from devops ServerEnvironmentBuilder or copy from template."
    ISSUES=$((ISSUES + ENV_MISSING))
  fi
else
  echo "$WARN Skipped — cloud repo not found"
fi
echo ""

# --- Summary ---
echo "=========================================="
if [ "$ISSUES" -eq 0 ]; then
  echo " All prerequisites satisfied!"
else
  echo " $ISSUES issue(s) found. Review above."
fi
echo "=========================================="

exit "$ISSUES"
