#!/bin/bash

##############################################################################
# Script de Despliegue para Informados CV en cPanel
# Uso: bash deploy.sh [production|staging]
##############################################################################

set -e  # Salir si hay algún error

# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Función para imprimir mensajes
print_message() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# Banner
echo ""
echo "╔═══════════════════════════════════════════════════════════╗"
echo "║         🚀 Informados CV - Deployment Script             ║"
echo "╚═══════════════════════════════════════════════════════════╝"
echo ""

# Verificar que estamos en el directorio correcto
if [ ! -f "artisan" ]; then
    print_error "No se encontró el archivo 'artisan'. ¿Estás en el directorio raíz del proyecto?"
    exit 1
fi

# Obtener entorno (production o staging)
ENVIRONMENT=${1:-production}

print_message "Entorno seleccionado: $ENVIRONMENT"
echo ""

##############################################################################
# PASO 1: Poner aplicación en modo mantenimiento
##############################################################################
print_message "Paso 1: Activando modo mantenimiento..."
php artisan down --retry=60 || print_warning "No se pudo activar modo mantenimiento (quizás ya está activo)"
print_success "Modo mantenimiento activado"
echo ""

##############################################################################
# PASO 2: Git Pull (si es un deployment desde servidor)
##############################################################################
if [ -d ".git" ]; then
    print_message "Paso 2: Obteniendo últimos cambios desde Git..."

    # Mostrar rama actual
    CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
    print_message "Rama actual: $CURRENT_BRANCH"

    # Pull changes
    git pull origin $CURRENT_BRANCH || {
        print_error "Error al hacer git pull"
        php artisan up
        exit 1
    }

    print_success "Cambios descargados desde Git"
else
    print_warning "No es un repositorio Git, saltando este paso..."
fi
echo ""

##############################################################################
# PASO 3: Instalar/Actualizar dependencias de Composer
##############################################################################
print_message "Paso 3: Instalando dependencias de Composer..."

if [ "$ENVIRONMENT" == "production" ]; then
    composer install --optimize-autoloader --no-dev --no-interaction || {
        print_error "Error al instalar dependencias de Composer"
        php artisan up
        exit 1
    }
else
    composer install --optimize-autoloader --no-interaction || {
        print_error "Error al instalar dependencias de Composer"
        php artisan up
        exit 1
    }
fi

print_success "Dependencias de Composer instaladas"
echo ""

##############################################################################
# PASO 4: Instalar dependencias de NPM (si hay cambios en frontend)
##############################################################################
if [ -f "package.json" ]; then
    print_message "Paso 4: Instalando dependencias de NPM..."
    npm install --production=false || print_warning "Error al instalar dependencias de NPM (continuando...)"

    print_message "Compilando assets con Vite..."
    npm run build || {
        print_error "Error al compilar assets"
        php artisan up
        exit 1
    }

    print_success "Assets compilados correctamente"
else
    print_warning "No se encontró package.json, saltando instalación de NPM"
fi
echo ""

##############################################################################
# PASO 5: Ejecutar migraciones
##############################################################################
print_message "Paso 5: Ejecutando migraciones de base de datos..."

read -p "¿Deseas ejecutar las migraciones? (s/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[SsYy]$ ]]; then
    php artisan migrate --force || {
        print_error "Error al ejecutar migraciones"
        php artisan up
        exit 1
    }
    print_success "Migraciones ejecutadas correctamente"
else
    print_warning "Migraciones omitidas"
fi
echo ""

##############################################################################
# PASO 6: Limpiar cachés antiguos
##############################################################################
print_message "Paso 6: Limpiando cachés antiguos..."

php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan route:clear
php artisan event:clear

print_success "Cachés limpiados"
echo ""

##############################################################################
# PASO 7: Generar cachés optimizados (solo en production)
##############################################################################
if [ "$ENVIRONMENT" == "production" ]; then
    print_message "Paso 7: Generando cachés optimizados para producción..."

    php artisan config:cache
    php artisan route:cache
    php artisan view:cache
    php artisan event:cache

    # Optimizar autoload
    composer dump-autoload --optimize --classmap-authoritative --no-dev

    print_success "Cachés optimizados generados"
else
    print_warning "Entorno no es production, saltando optimizaciones de caché"
fi
echo ""

##############################################################################
# PASO 8: Crear enlace simbólico de storage (si no existe)
##############################################################################
print_message "Paso 8: Verificando enlace de storage..."

if [ ! -L "public/storage" ]; then
    php artisan storage:link
    print_success "Enlace de storage creado"
else
    print_success "Enlace de storage ya existe"
fi
echo ""

##############################################################################
# PASO 9: Ajustar permisos
##############################################################################
print_message "Paso 9: Ajustando permisos de directorios..."

chmod -R 775 storage bootstrap/cache || print_warning "No se pudieron ajustar algunos permisos"

print_success "Permisos ajustados"
echo ""

##############################################################################
# PASO 10: Reiniciar queue workers (si están configurados)
##############################################################################
print_message "Paso 10: Reiniciando queue workers..."

php artisan queue:restart || print_warning "No se pudieron reiniciar los queue workers"

print_success "Queue workers reiniciados"
echo ""

##############################################################################
# PASO 11: Desactivar modo mantenimiento
##############################################################################
print_message "Paso 11: Desactivando modo mantenimiento..."

php artisan up

print_success "Modo mantenimiento desactivado"
echo ""

##############################################################################
# RESUMEN
##############################################################################
echo ""
echo "╔═══════════════════════════════════════════════════════════╗"
echo "║              ✅ Despliegue Completado                     ║"
echo "╚═══════════════════════════════════════════════════════════╝"
echo ""
print_success "La aplicación ha sido desplegada exitosamente en $ENVIRONMENT"
echo ""
echo "📋 Próximos pasos recomendados:"
echo "  1. Verificar que la aplicación funciona: https://tudominio.com"
echo "  2. Verificar admin panel: https://tudominio.com/admin"
echo "  3. Revisar logs: tail -f storage/logs/laravel.log"
echo "  4. Verificar queue workers: ps aux | grep 'queue:work'"
echo ""
echo "🔍 Si encuentras problemas:"
echo "  - Revisa logs: storage/logs/laravel.log"
echo "  - Verifica permisos: ls -la storage/"
echo "  - Limpia caché: php artisan optimize:clear"
echo ""
