#!/usr/bin/env bash
# Uso: sudo ./deploy.sh
# Actualiza el codigo, reconstruye contenedores, migra y limpia cache.
set -euo pipefail

# Todo va dentro de una funcion: bash la lee completa antes de ejecutarla,
# asi el git pull puede reescribir este archivo sin romper la corrida en curso.
main() {
  cd "$(dirname "$(readlink -f "$0")")"

  if [ "$(id -u)" -ne 0 ]; then
    echo "Ejecutar con sudo: sudo ./deploy.sh" >&2
    exit 1
  fi

  echo "==> git pull"
  git pull

  echo "==> Reconstruyendo contenedores"
  docker compose up -d --build --force-recreate app web tenant-worker

  # var/cache esta en el volumen montado y sobrevive al rebuild: si queda el
  # contenedor de Symfony compilado con el codigo anterior, los comandos de
  # abajo fallan (ej. constructor con argumentos nuevos). Se limpia antes de usarlos.
  echo "==> Limpiando cache vieja"
  docker compose exec -T -u root app sh -lc 'rm -rf var/cache/*'

  echo "==> Migraciones (base central mbinvcxp)"
  docker compose exec -T app php bin/console doctrine:migrations:migrate --no-interaction

  # Las bases database_per_client no reciben las migraciones de Doctrine:
  # repair-all aplica el drift aditivo de schema y catalogos en cada tenant.
  # Un tenant con error no detiene a los demas; se revisa el resumen final.
  echo "==> Migracion multitenant (repair-all --execute)"
  docker compose exec -T -e ALLOW_TENANT_DATA_MIGRATION=1 app php bin/console app:tenant:repair-all --execute

  # El repo esta montado sobre /var/www/html y public/build esta en .gitignore:
  # el build hecho al construir la imagen queda tapado, hay que compilar en el volumen.
  echo "==> Compilando assets (CSS/JS)"
  docker compose exec -T -u root app sh -lc '
  set -e
  npm ci --ignore-scripts || npm install --ignore-scripts
  npm run build
  '

  echo "==> Permisos de cache, logs y uploads"
  docker compose exec -T -u root app sh -lc '
  set -e
  rm -rf var/cache/*
  mkdir -p var/cache/prod/doctrine/orm/Proxies var/log public/uploads/adjuntos
  chown -R www-data:www-data var/cache var/log public/uploads
  chmod -R ug+rwX var/cache var/log public/uploads
  su -s /bin/sh www-data -c "test -w var/cache/prod/doctrine/orm/Proxies && echo Proxies writable by www-data"
  '

  echo "==> Cache prod"
  docker compose exec -T -u www-data app php bin/console cache:clear --env=prod --no-debug
  docker compose exec -T -u www-data app php bin/console cache:warmup --env=prod --no-debug

  echo "==> Reiniciando servicios"
  docker compose restart app web tenant-worker

  echo "==> Logs recientes de app"
  docker compose logs --since=3m app

  echo "Deploy terminado."
}

main "$@"
exit $?
