#!/usr/bin/env bash

set -euo pipefail

# Script para rebuild completo/rápido del entorno de desarrollo (macOS/Linux)
# Uso:
#   ./rebuild_development.sh            # Rebuild rápido (solo contenedores)
#   ./rebuild_development.sh --full     # Rebuild completo (sin cache)

FULL_REBUILD=false
if [[ ${1:-} == "--full" ]]; then
  FULL_REBUILD=true
fi

echo
if [[ "$FULL_REBUILD" == true ]]; then
  echo "=== REBUILD DEVELOPMENT COMPLETO - AI Learning Platform ==="
  echo "Iniciando rebuild completo sin cache..."
else
  echo "=== REBUILD DEVELOPMENT RAPIDO - AI Learning Platform ==="
  echo "Iniciando rebuild rapido de contenedores..."
fi

# Verificar que estamos en el directorio correcto
if [[ ! -f "package.json" ]]; then
  echo "ERROR: No se encontró package.json. Ejecutar desde el directorio raíz del proyecto." >&2
  exit 1
fi

if ! command -v docker-compose >/dev/null 2>&1; then
  echo "ERROR: docker-compose no está instalado o no está en PATH." >&2
  exit 1
fi

# 1. Detener contenedores si están corriendo
echo
echo "1. Deteniendo contenedores existentes..."
if docker-compose --profile dev down; then
  echo "Contenedores detenidos correctamente."
else
  echo "No había contenedores corriendo o error al detenerlos (continuando)."
fi

if [[ "$FULL_REBUILD" != true ]]; then
  # Rebuild rápido
  echo
  echo "2. Construyendo imágenes..."
  docker-compose --profile dev build
  echo "Imágenes construidas correctamente."

  echo
  echo "3. Iniciando contenedores..."
  docker-compose --profile dev up -d
  echo "Contenedores iniciados correctamente."

  echo
  echo "4. Verificando estado de los contenedores..."
  sleep 3
  docker-compose ps

  echo
  echo "=== REBUILD RÁPIDO COMPLETADO ==="
  echo "Los contenedores han sido reconstruidos e iniciados."
  echo "Backend: http://localhost:3000"
  echo "Frontend: http://localhost:5173"
  echo
  echo "Para ver los logs: docker-compose logs -f"
  echo "Para detener: docker-compose down"
  exit 0
fi

# CONTINUAR CON REBUILD COMPLETO (--full)

# 2. Detener todos los contenedores del proyecto
echo
echo "2. Deteniendo todos los contenedores del proyecto..."
if docker-compose --profile dev down; then
  echo "Todos los contenedores del proyecto detenidos."
else
  echo "No había contenedores del proyecto corriendo (continuando)."
fi

# 3. Eliminando objetos Docker específicos del proyecto
echo
echo "3. Eliminando objetos Docker del proyecto..."
# Eliminar contenedores, volúmenes y redes del proyecto usando docker-compose
docker-compose --profile dev down -v --remove-orphans || true
echo "Contenedores, volúmenes y redes del proyecto eliminados."

# Eliminar imágenes específicas del proyecto (solo si no están en uso)
echo "Eliminando imágenes del proyecto..."
docker rmi ai-learning-platform-ewc-backend:latest 2>/dev/null || true
docker rmi ai-learning-platform-ewc-frontend-dev:latest 2>/dev/null || true
docker rmi ai-learning-platform-ewc-frontend-prod:latest 2>/dev/null || true
echo "Imágenes del proyecto eliminadas."

# Limpieza segura: solo objetos dangling (no asociados a ningún contenedor)
echo "Limpiando objetos dangling del proyecto..."
# Solo eliminar imágenes dangling (sin etiquetas y no usadas)
docker image prune -f --filter "dangling=true" 2>/dev/null || true
# Solo eliminar volúmenes huérfanos (no asociados a ningún contenedor)
docker volume prune -f --filter "dangling=true" 2>/dev/null || true
# Solo eliminar redes no usadas (sin contenedores conectados)
docker network prune -f --filter "until=24h" 2>/dev/null || true
echo "Limpieza de objetos dangling completada."

echo
echo "4. Limpiando dependencias del backend..."
rm -rf backend/node_modules || true
rm -f backend/package-lock.json || true
echo "Dependencias del backend eliminadas."

echo
echo "5. Limpiando dependencias del frontend..."
rm -rf frontend/node_modules || true
rm -f frontend/package-lock.json || true
echo "Dependencias del frontend eliminadas."

echo
echo "6. Limpiando carpetas de build..."
rm -rf backend/dist || true
rm -rf frontend/dist || true
echo "Carpetas de build eliminadas."

echo
echo "7. Reinstalando dependencias del backend..."
(
  cd backend
  npm install
)
echo "Dependencias del backend instaladas correctamente."

echo
echo "8. Reinstalando dependencias del frontend..."
(
  cd frontend
  npm install
)
echo "Dependencias del frontend instaladas correctamente."

echo
echo "9. Compilando backend..."
(
  cd backend
  npm run build
)
echo "Backend compilado correctamente."

echo
echo "10. Compilando frontend..."
(
  cd frontend
  npm run build
)
echo "Frontend compilado correctamente."

echo
echo "11. Reconstruyendo imágenes Docker sin cache..."
docker-compose --profile dev build --no-cache
echo "Imágenes Docker reconstruidas sin cache."

echo
echo "12. Iniciando contenedores..."
docker-compose --profile dev up -d
echo "Contenedores iniciados correctamente."

echo
echo "14. Verificando estado de los contenedores..."
sleep 5
docker-compose ps

echo
echo "=== REBUILD COMPLETO COMPLETADO ==="
echo "El proyecto ha sido reconstruido completamente sin cache."
echo "Backend: http://localhost:3000"
echo "Frontend: http://localhost:5173"
echo
echo "Para ver los logs: docker-compose logs -f"
echo "Para detener: docker-compose down"


