#!/usr/bin/env bash
#
# update.projects — actualizează mai multe proiecte Symfony dintr-o singură rulare:
#   git pull (--ff-only) → composer install (doar dacă e cazul) → app:db:migrate → cache:clear
#
# Folosește CĂI ABSOLUTE (editează lista PROJECTS de mai jos), deci scriptul poate sta ORIUNDE
# — nu contează unde e pus, nu are nevoie să se „întoarcă un pas" și nici să se auto-detecteze.
# Proiectele pot fi în locuri diferite, nu neapărat surori.
#
# Rulează ca utilizatorul care DEȚINE fișierele (perms var/cache, var/log):
#     bash update.projects
# Mediu implicit: prod. Pentru dev:  APP_ENV=dev bash update.projects
#
# Continuă la toate proiectele chiar dacă unul pică; iese cu cod ≠0 dacă vreunul a eșuat
# (util ca gate în cron cu mail-on-error).
#
set -uo pipefail

# ── Editează căile absolute ale proiectelor ──
PROJECTS=(
  "$HOME/amme-dev/ycm-skeleton-backend-symfony"
  "$HOME/amme-dev/cut-ycm-backend-symfony"
  "$HOME/amme-dev/umfcv-app-backend-symfony"
  "$HOME/amme-dev/sfantul-toader-backend-symfony"
)

export APP_ENV="${APP_ENV:-prod}"
PHP="php"   # pune calea completă dacă `php` nu e versiunea corectă
            # (cPanel: /opt/cpanel/ea-php82/root/usr/bin/php)

# Corpul e într-o funcție apelată la final: bash o parsează COMPLET înainte s-o ruleze, deci
# scriptul rămâne stabil chiar dacă un `git pull` i-ar atinge propriul fișier în timpul rulării.
main() {
  local failed=() dir before after
  for dir in "${PROJECTS[@]}"; do
    printf '\n\033[1m▶ %s\033[0m\n' "$dir"

    if [[ ! -d "$dir/.git" ]]; then
      echo "  ✗ lipsă .git/ — skip"
      failed+=("$dir (no .git)")
      continue
    fi

    # Subshell izolat: `cd` și o eroare nu se scurg la următorul proiect.
    if (
      set -e
      cd "$dir"

      before=$(git rev-parse HEAD)
      git pull --ff-only
      after=$(git rev-parse HEAD)

      if [[ "$before" == "$after" ]]; then
        echo "  = deja la zi (nimic de făcut)"
        exit 0
      fi

      # composer install DOAR dacă s-a schimbat composer.lock în pull (altfel migrate poate
      # pica pe o dependență nouă lipsă).
      if git diff --name-only "$before" "$after" | grep -q '^composer\.lock$'; then
        echo "  → composer install (composer.lock schimbat)"
        composer install --no-dev --optimize-autoloader --no-interaction
      fi

      echo "  → app:db:migrate"
      "$PHP" bin/console app:db:migrate --no-interaction

      echo "  → cache:clear"
      "$PHP" bin/console cache:clear --no-interaction
    ); then
      echo "  ✓ OK"
    else
      echo "  ✗ EȘEC"
      failed+=("$dir")
    fi
  done

  echo
  if [[ ${#failed[@]} -eq 0 ]]; then
    echo "✓ Toate proiectele la zi."
    return 0
  fi
  printf '✗ Eșuat (%d): %s\n' "${#failed[@]}" "${failed[*]}"
  return 1
}

main "$@"
