#!/bin/bash

# ========================================
# Script: setup_cd_project.sh
# Descripción: Inicializa un proyecto CD (Product-4) con configuración automatizada
# Autor: Compañia Digital
# ========================================

# Colores
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'

# Obtener el directorio del script
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Navegar al directorio raíz del proyecto (un nivel arriba de scripts/)
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"

# Cambiar al directorio raíz del proyecto
cd "$PROJECT_ROOT"

clear
echo -e "${YELLOW}===========================================${NC}"
echo -e "${YELLOW} Inicializando entorno CD Project        ${NC}"
echo -e "${YELLOW}===========================================${NC}"
echo -e "${GREEN}Directorio del proyecto: $PROJECT_ROOT${NC}"

# Función para instalar Composer si no está disponible (útil en cPanel)
ensure_composer() {
  if command -v composer >/dev/null 2>&1; then
    echo -e "${GREEN}✅ Composer encontrado:$(composer --version | head -n1)${NC}"
    return 0
  fi

  echo -e "${YELLOW}⚠️  Composer no está instalado. Intentando instalación local...${NC}"

  local php_bin
  php_bin="$(command -v php 2>/dev/null)"
  if [ -z "$php_bin" ]; then
    echo -e "${RED}Error: PHP no está instalado, requerido para instalar Composer.${NC}"
    return 1
  fi

  local local_bin="$HOME/.local/bin"
  local composer_bin="$local_bin/composer"
  mkdir -p "$local_bin"

  local installer
  installer="$(mktemp)"

  if command -v curl >/dev/null 2>&1; then
    curl -sS https://getcomposer.org/installer -o "$installer"
  elif command -v wget >/dev/null 2>&1; then
    wget -q -O "$installer" https://getcomposer.org/installer
  else
    echo -e "${RED}Error: Se requiere curl o wget para descargar Composer.${NC}"
    rm -f "$installer"
    return 1
  fi

  if ! "$php_bin" -d allow_url_fopen=On "$installer" --install-dir="$local_bin" --filename=composer >/dev/null 2>&1; then
    echo -e "${YELLOW}⚠️  Instalación estándar falló. Intentando descargar composer-stable.phar...${NC}"
    if command -v curl >/dev/null 2>&1; then
      curl -sS https://getcomposer.org/composer-stable.phar -o "$composer_bin"
    else
      wget -q -O "$composer_bin" https://getcomposer.org/composer-stable.phar
    fi
    chmod +x "$composer_bin"
  fi

  rm -f "$installer"
  chmod +x "$composer_bin"
  export PATH="$local_bin:$PATH"

  if command -v composer >/dev/null 2>&1; then
    echo -e "${GREEN}✅ Composer instalado en $composer_bin${NC}"
    return 0
  fi

  echo -e "${RED}Error: No se pudo instalar Composer. Instálalo manualmente y vuelve a intentar.${NC}"
  return 1
}

# 1️⃣ Verificar dependencias básicas
if ! command -v php &> /dev/null; then
  echo -e "${RED}Error: 'php' no está instalado.${NC}"
  exit 1
fi

if ! ensure_composer; then
  exit 1
fi

COMPOSER_BIN="$(command -v composer 2>/dev/null)"
if [ -z "$COMPOSER_BIN" ]; then
  COMPOSER_BIN="$HOME/.local/bin/composer"
fi

# 2️⃣ Verificar que estamos en el directorio correcto
if [ ! -f "composer.json" ] || [ ! -f "artisan" ]; then
  echo -e "${RED}Error: No se encontraron los archivos composer.json o artisan.${NC}"
  echo -e "${RED}Asegúrate de ejecutar este script desde el directorio raíz del proyecto.${NC}"
  exit 1
fi

# 3️⃣ Detectar si estamos en cPanel
IS_CPANEL=false
if [ -d "/opt/cpanel" ] || [ -d "/usr/local/cpanel" ] || [ -f "/etc/cpanel" ]; then
  IS_CPANEL=true
fi

# 4️⃣ Pedir datos de proyecto y base
read -p "🔧 Ingresá el nombre del proyecto (ej: fundacionchaka): " PROJECT_NAME
read -p "🔧 Ingresá el nombre de la base de datos: " DB_NAME

# 5️⃣ ¿Estás en cPanel? Si sí, pedir credenciales, GA_ID y marcar env
# Si CPANEL ya está definido (viene de create-complete-project.sh), usarlo
if [ -n "${CPANEL:-}" ]; then
  echo -e "${GREEN}✅ Usando configuración de cPanel: $CPANEL${NC}"
elif [ "$IS_CPANEL" = true ]; then
  CPANEL="s"
  echo -e "${GREEN}✅ cPanel detectado automáticamente${NC}"
else
  read -p "❓ ¿Estás en cPanel? (s/n): " CPANEL
fi

# 6️⃣ Verificar extensiones PHP requeridas
echo -e "${YELLOW}Verificando extensiones PHP requeridas...${NC}"
MISSING_EXTENSIONS=()
REQUIRED_EXTENSIONS=("fileinfo" "pdo" "mbstring" "xml" "curl" "zip" "gd")

for ext in "${REQUIRED_EXTENSIONS[@]}"; do
  if ! php -m | grep -qi "^$ext$"; then
    MISSING_EXTENSIONS+=("$ext")
  fi
done

if [ ${#MISSING_EXTENSIONS[@]} -gt 0 ]; then
  echo -e "${RED}⚠️  Extensiones PHP faltantes: ${MISSING_EXTENSIONS[*]}${NC}"
  if [[ "$CPANEL" == "s" ]]; then
    echo -e "${YELLOW}Para habilitar extensiones en cPanel:${NC}"
    echo -e "${YELLOW}1. Ve a 'Select PHP Version' en cPanel${NC}"
    echo -e "${YELLOW}2. Haz clic en 'Extensions'${NC}"
    echo -e "${YELLOW}3. Habilita las extensiones faltantes (especialmente 'fileinfo')${NC}"
    echo -e "${YELLOW}4. Guarda los cambios${NC}"
    echo ""
    read -p "¿Deseas continuar ignorando los requisitos de plataforma? (s/n): " IGNORE_PLATFORM
    if [[ "$IGNORE_PLATFORM" != "s" ]]; then
      echo -e "${RED}Instalación cancelada. Por favor, habilita las extensiones PHP requeridas primero.${NC}"
      exit 1
    fi
  else
    echo -e "${RED}Por favor, habilita las extensiones PHP requeridas antes de continuar.${NC}"
    exit 1
  fi
else
  echo -e "${GREEN}✅ Todas las extensiones PHP requeridas están habilitadas.${NC}"
  IGNORE_PLATFORM="n"
fi
if [[ "$CPANEL" == "s" ]]; then
  read -p "🔑 Ingresá el usuario de la base de datos: " DB_USER
  read -s -p "🔑 Ingresá la contraseña de la base de datos: " DB_PASS
  echo
  read -p "🌐 Ingresá tu GOOGLE_ANALYTICS_ID (ej: UA-XXXXX-Y): " GA_ID
fi

# 7️⃣ Instalar dependencias PHP
echo -e "${YELLOW}Instalando dependencias...${NC}"

# Si faltan extensiones, usar --no-scripts para evitar ejecutar ide-helper que requiere fileinfo
if [[ "$IGNORE_PLATFORM" == "s" ]]; then
  echo -e "${YELLOW}⚠️  Instalando con --ignore-platform-reqs y --no-scripts (workaround temporal)${NC}"
  echo -e "${YELLOW}⚠️  Los scripts post-install se omitirán porque requieren extensiones PHP faltantes${NC}"
  if ! "$COMPOSER_BIN" update --no-interaction --ignore-platform-reqs --no-scripts; then
    echo -e "${RED}Error: La instalación de dependencias falló.${NC}"
    echo -e "${RED}Por favor, habilita la extensión 'fileinfo' en cPanel y vuelve a intentar.${NC}"
    exit 1
  fi

  # Ejecutar solo los scripts que no requieren fileinfo
  echo -e "${YELLOW}Ejecutando scripts compatibles...${NC}"
  php artisan package:discover --ansi || true
  echo -e "${YELLOW}⚠️  Nota: ide-helper se omitió porque requiere 'fileinfo'${NC}"
  echo -e "${YELLOW}⚠️  Algunas funcionalidades pueden no funcionar hasta que habilites 'fileinfo' en cPanel${NC}"
else
  if ! "$COMPOSER_BIN" update --no-interaction; then
    echo -e "${RED}Error: La instalación de dependencias falló.${NC}"
    echo -e "${RED}Revisa los errores arriba y asegúrate de que todas las extensiones PHP requeridas estén habilitadas.${NC}"
    exit 1
  fi
fi

# 8️⃣ Preparar .env
if [ ! -f ".env" ]; then
  echo -e "${YELLOW}Creando .env desde .env.example...${NC}"
  if [ -f ".env.example" ]; then
    cp .env.example .env
  else
    echo -e "${RED}Error: No se encontró el archivo .env.example${NC}"
    exit 1
  fi
else
  echo -e "${GREEN}.env ya existe, actualizando valores...${NC}"
fi

# 9️⃣ Reemplazar variables en .env
if [[ "$OSTYPE" == "darwin"* || "$OSTYPE" == "msys"* ]]; then
  sed -i "" "s/^APP_NAME=.*/APP_NAME=\"$PROJECT_NAME\"/" .env
  sed -i "" "s/^DB_DATABASE=.*/DB_DATABASE=$DB_NAME/" .env
  sed -i "" "s/^RUN_PROJECT_SEEDER=.*/RUN_PROJECT_SEEDER=true/" .env
  if [[ "$CPANEL" == "s" ]]; then
    sed -i "" "s/^DB_USERNAME=.*/DB_USERNAME=$DB_USER/" .env
    sed -i "" "s/^DB_PASSWORD=.*/DB_PASSWORD=$DB_PASS/" .env
    sed -i "" "s|^GOOGLE_ANALYTICS_ID=.*|GOOGLE_ANALYTICS_ID=$GA_ID|" .env
    sed -i "" "s/^APP_ENV=.*/APP_ENV=production/" .env
  else
    # En local, configurar credenciales por defecto y APP_ENV=local
    sed -i "" "s/^DB_USERNAME=.*/DB_USERNAME=root/" .env
    sed -i "" "s/^DB_PASSWORD=.*/DB_PASSWORD=/" .env
    sed -i "" "s/^APP_ENV=.*/APP_ENV=local/" .env
  fi
else
  sed -i "s/^APP_NAME=.*/APP_NAME=\"$PROJECT_NAME\"/" .env
  sed -i "s/^DB_DATABASE=.*/DB_DATABASE=$DB_NAME/" .env
  sed -i "s/^RUN_PROJECT_SEEDER=.*/RUN_PROJECT_SEEDER=true/" .env
  if [[ "$CPANEL" == "s" ]]; then
    sed -i "s/^DB_USERNAME=.*/DB_USERNAME=$DB_USER/" .env
    sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=$DB_PASS/" .env
    sed -i "s|^GOOGLE_ANALYTICS_ID=.*|GOOGLE_ANALYTICS_ID=$GA_ID|" .env
    sed -i "s/^APP_ENV=.*/APP_ENV=production/" .env
  else
    # En local, configurar credenciales por defecto y APP_ENV=local
    sed -i "s/^DB_USERNAME=.*/DB_USERNAME=root/" .env
    sed -i "s/^DB_PASSWORD=.*/DB_PASSWORD=/" .env
    sed -i "s/^APP_ENV=.*/APP_ENV=local/" .env
  fi
fi

# 🔟 Crear base de datos (si no es cPanel)
if [[ "$CPANEL" != "s" ]]; then
  echo -e "${YELLOW}Verificando y creando base de datos '$DB_NAME'...${NC}"

  # Detectar ruta de MySQL (XAMPP en macOS)
  MYSQL_CMD=""
  if [ -f "/Applications/XAMPP/xamppfiles/bin/mysql" ]; then
    MYSQL_CMD="/Applications/XAMPP/xamppfiles/bin/mysql"
  elif command -v mysql &> /dev/null; then
    MYSQL_CMD="mysql"
  else
    echo -e "${RED}Error: No se encontró el comando mysql.${NC}"
    echo -e "${YELLOW}Por favor, crea la base de datos manualmente:${NC}"
    echo -e "${GREEN}mysql -u root -e \"CREATE DATABASE IF NOT EXISTS $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\"${NC}"
    read -p "Presiona Enter después de crear la base de datos..."
  fi

  if [ -n "$MYSQL_CMD" ]; then
    # Verificar si MySQL está corriendo
    if ! $MYSQL_CMD -u root -e "SELECT 1;" >/dev/null 2>&1; then
      echo -e "${YELLOW}⚠️  No se pudo conectar a MySQL.${NC}"
      echo -e "${YELLOW}Verifica que MySQL esté corriendo.${NC}"
      echo -e "${YELLOW}En XAMPP: Inicia MySQL desde el panel de control${NC}"
      echo ""
      read -p "¿Deseas continuar de todos modos? (s/n): " CONTINUE_DB
      if [[ ! "$CONTINUE_DB" =~ ^[sS]$ ]]; then
        echo -e "${RED}Instalación cancelada. Por favor, inicia MySQL y vuelve a intentar.${NC}"
        exit 1
      fi
    else
      # Intentar crear la base de datos
      if $MYSQL_CMD -u root -e "CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 2>/dev/null; then
        echo -e "${GREEN}✅ Base de datos '$DB_NAME' creada exitosamente${NC}"
      else
        echo -e "${YELLOW}⚠️  No se pudo crear la base de datos automáticamente.${NC}"
        echo -e "${YELLOW}Por favor, créala manualmente:${NC}"
        echo -e "${GREEN}$MYSQL_CMD -u root -e \"CREATE DATABASE IF NOT EXISTS \\\`$DB_NAME\\\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\"${NC}"
        read -p "Presiona Enter después de crear la base de datos..."
      fi
    fi
  fi
fi

# 🔟 Generar app key y optimizar
echo -e "${YELLOW}Generando APP_KEY y optimizando...${NC}"
php artisan key:generate --ansi --force
php artisan optimize:clear --ansi --force
php artisan storage:link --ansi --force

# 1️⃣1️⃣ Migrar y seedear
echo -e "${YELLOW}Ejecutando migrate:fresh --seed...${NC}"
if ! php artisan migrate:fresh --seed --ansi --force; then
    echo -e "${RED}Error: Las migraciones fallaron. Por favor, revisa los errores arriba.${NC}"
    echo -e "${YELLOW}Verifica que:${NC}"
    echo -e "  1. La base de datos '$DB_NAME' existe"
    echo -e "  2. Las credenciales en .env son correctas"
    echo -e "  3. MySQL está corriendo"
    exit 1
fi

# 1️⃣2️⃣ Mensaje final
echo -e "${GREEN}\n✅ Proyecto '$PROJECT_NAME' inicializado correctamente.${NC}"
echo -e "${YELLOW}APP_NAME: ${GREEN}$PROJECT_NAME${NC}"
echo -e "${YELLOW}DB_DATABASE: ${GREEN}$DB_NAME${NC}"
if [[ "$CPANEL" == "s" ]]; then
  echo -e "${YELLOW}DB_USERNAME: ${GREEN}$DB_USER${NC}"
  echo -e "${YELLOW}GA_ID: ${GREEN}$GA_ID${NC}"
  echo -e "${YELLOW}APP_ENV: ${GREEN}production${NC}"
fi
echo -e "\n${YELLOW}Para iniciar el servidor ejecuta:${NC}"
echo -e "${GREEN}php artisan serve${NC}"
echo -e "\n${YELLOW}Usuario demo:${NC} admin@$PROJECT_NAME.com"
echo -e "${YELLOW}Contraseña demo:${NC} password"
