#!/bin/bash

################################################################################
# Script de Despliegue Automático - LafortunaApp Backend en cPanel
#
# Uso:
#   chmod +x deploy-cpanel.sh
#   ./deploy-cpanel.sh [opción]
#
# Opciones:
#   install     - Primera instalación completa
#   update      - Actualizar código existente
#   migrate     - Solo ejecutar migraciones
#   optimize    - Solo optimizar caché
#   rollback    - Revertir última migración
################################################################################

set -e  # Salir si hay 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

# Funciones de utilidad
print_step() {
    echo -e "${BLUE}==>${NC} $1"
}

print_success() {
    echo -e "${GREEN}✓${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}⚠${NC} $1"
}

print_error() {
    echo -e "${RED}✗${NC} $1"
}

# Verificar que estamos en el directorio correcto
if [ ! -f "artisan" ]; then
    print_error "Este script debe ejecutarse desde el directorio backend/"
    exit 1
fi

################################################################################
# FUNCIÓN: Primera Instalación
################################################################################
install() {
    print_step "Iniciando instalación completa..."

    # 1. Verificar .env
    if [ ! -f ".env" ]; then
        print_warning "Archivo .env no encontrado. Copiando desde .env.example..."
        cp .env.example .env
        print_warning "Por favor, edita el archivo .env con tus credenciales antes de continuar."
        exit 1
    fi

    # 2. Instalar dependencias
    print_step "Instalando dependencias de Composer..."
    if command -v composer &> /dev/null; then
        composer install --no-dev --optimize-autoloader
    else
        php composer.phar install --no-dev --optimize-autoloader
    fi
    print_success "Dependencias instaladas"

    # 3. Generar claves
    print_step "Generando claves de aplicación..."
    php artisan key:generate --force
    print_success "APP_KEY generada"

    print_step "Generando clave JWT..."
    php artisan jwt:secret --force
    print_success "JWT_SECRET generada"

    # 4. Permisos
    print_step "Configurando permisos..."
    chmod -R 775 storage bootstrap/cache
    print_success "Permisos configurados"

    # 5. Storage link
    print_step "Creando enlace simbólico de storage..."
    php artisan storage:link || print_warning "No se pudo crear enlace simbólico (puede requerir permisos especiales)"

    # 6. Migraciones
    print_step "Ejecutando migraciones..."
    php artisan migrate --force
    print_success "Migraciones ejecutadas"

    # 7. Seeders
    read -p "¿Deseas ejecutar los seeders? (s/N): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Ss]$ ]]; then
        print_step "Ejecutando seeders..."
        php artisan db:seed --force
        print_success "Seeders ejecutados"
    fi

    # 8. Optimización
    optimize

    print_success "¡Instalación completa!"
}

################################################################################
# FUNCIÓN: Actualización
################################################################################
update() {
    print_step "Iniciando actualización..."

    # 1. Modo mantenimiento
    print_step "Activando modo mantenimiento..."
    php artisan down || print_warning "No se pudo activar modo mantenimiento"

    # 2. Actualizar código (si usa Git)
    if [ -d ".git" ]; then
        print_step "Actualizando código desde Git..."
        git pull origin master || git pull origin main
        print_success "Código actualizado"
    else
        print_warning "No es un repositorio Git. Asegúrate de haber subido los archivos actualizados."
    fi

    # 3. Actualizar dependencias
    print_step "Actualizando dependencias..."
    if command -v composer &> /dev/null; then
        composer install --no-dev --optimize-autoloader
    else
        php composer.phar install --no-dev --optimize-autoloader
    fi
    print_success "Dependencias actualizadas"

    # 4. Limpiar caché
    print_step "Limpiando caché..."
    php artisan config:clear
    php artisan cache:clear
    php artisan route:clear
    php artisan view:clear
    print_success "Caché limpiado"

    # 5. Migraciones
    print_step "Ejecutando migraciones..."
    php artisan migrate --force
    print_success "Migraciones ejecutadas"

    # 6. Optimizar
    optimize

    # 7. Desactivar modo mantenimiento
    print_step "Desactivando modo mantenimiento..."
    php artisan up
    print_success "Aplicación en línea"

    print_success "¡Actualización completa!"
}

################################################################################
# FUNCIÓN: Solo Migraciones
################################################################################
migrate() {
    print_step "Ejecutando migraciones..."
    php artisan migrate --force
    print_success "Migraciones ejecutadas"
}

################################################################################
# FUNCIÓN: Optimización
################################################################################
optimize() {
    print_step "Optimizando aplicación..."

    php artisan config:cache
    print_success "Configuración cacheada"

    php artisan route:cache
    print_success "Rutas cacheadas"

    php artisan view:cache
    print_success "Vistas cacheadas"

    if command -v composer &> /dev/null; then
        composer dump-autoload --optimize --no-dev
    else
        php composer.phar dump-autoload --optimize --no-dev
    fi
    print_success "Autoload optimizado"

    print_success "Optimización completa"
}

################################################################################
# FUNCIÓN: Rollback
################################################################################
rollback() {
    print_warning "Esta acción revertirá la última migración."
    read -p "¿Estás seguro? (s/N): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Ss]$ ]]; then
        print_step "Revirtiendo migración..."
        php artisan migrate:rollback --force
        print_success "Migración revertida"
    else
        print_warning "Operación cancelada"
    fi
}

################################################################################
# FUNCIÓN: Diagnóstico
################################################################################
diagnose() {
    print_step "Ejecutando diagnóstico del sistema..."

    echo ""
    echo "=== Información del Sistema ==="

    # PHP Version
    echo -n "PHP Version: "
    php -v | head -n 1

    # Composer
    echo -n "Composer: "
    if command -v composer &> /dev/null; then
        composer --version | head -n 1
    else
        echo "No instalado globalmente (usando composer.phar)"
    fi

    # Extensiones PHP
    echo ""
    echo "Extensiones PHP requeridas:"
    extensions=("bcmath" "ctype" "curl" "fileinfo" "json" "mbstring" "openssl" "pdo" "pdo_mysql" "tokenizer" "xml" "zip")
    for ext in "${extensions[@]}"; do
        if php -m | grep -q "^$ext$"; then
            echo -e "  ${GREEN}✓${NC} $ext"
        else
            echo -e "  ${RED}✗${NC} $ext (FALTA)"
        fi
    done

    # Permisos
    echo ""
    echo "Permisos de directorios:"
    for dir in "storage" "bootstrap/cache"; do
        if [ -w "$dir" ]; then
            echo -e "  ${GREEN}✓${NC} $dir (escribible)"
        else
            echo -e "  ${RED}✗${NC} $dir (NO escribible)"
        fi
    done

    # Archivo .env
    echo ""
    echo -n ".env: "
    if [ -f ".env" ]; then
        echo -e "${GREEN}✓${NC} Existe"

        # Verificar variables críticas
        if grep -q "APP_KEY=.\+" .env; then
            echo -e "  ${GREEN}✓${NC} APP_KEY configurada"
        else
            echo -e "  ${RED}✗${NC} APP_KEY no configurada"
        fi

        if grep -q "JWT_SECRET=.\+" .env; then
            echo -e "  ${GREEN}✓${NC} JWT_SECRET configurada"
        else
            echo -e "  ${RED}✗${NC} JWT_SECRET no configurada"
        fi

        if grep -q "DB_DATABASE=.\+" .env; then
            echo -e "  ${GREEN}✓${NC} DB_DATABASE configurada"
        else
            echo -e "  ${RED}✗${NC} DB_DATABASE no configurada"
        fi
    else
        echo -e "${RED}✗${NC} No existe"
    fi

    # Conexión a base de datos
    echo ""
    echo -n "Conexión a Base de Datos: "
    if php artisan db:show &>/dev/null; then
        echo -e "${GREEN}✓${NC} Exitosa"
    else
        echo -e "${RED}✗${NC} Fallida"
    fi

    echo ""
    print_success "Diagnóstico completo"
}

################################################################################
# FUNCIÓN: Limpiar todo
################################################################################
clean() {
    print_warning "Esta acción limpiará TODA la caché y optimizaciones."
    read -p "¿Continuar? (s/N): " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Ss]$ ]]; then
        print_step "Limpiando caché..."
        php artisan config:clear
        php artisan cache:clear
        php artisan route:clear
        php artisan view:clear
        php artisan clear-compiled

        print_step "Limpiando archivos temporales..."
        rm -rf storage/framework/cache/*
        rm -rf storage/framework/sessions/*
        rm -rf storage/framework/views/*

        print_success "Limpieza completa"
    else
        print_warning "Operación cancelada"
    fi
}

################################################################################
# FUNCIÓN: Ayuda
################################################################################
show_help() {
    cat << EOF
${BLUE}Script de Despliegue - LafortunaApp Backend${NC}

${YELLOW}Uso:${NC}
  ./deploy-cpanel.sh [opción]

${YELLOW}Opciones disponibles:${NC}
  ${GREEN}install${NC}     - Primera instalación completa (requiere .env configurado)
  ${GREEN}update${NC}      - Actualizar código existente (Git pull + migrate + optimize)
  ${GREEN}migrate${NC}     - Solo ejecutar migraciones pendientes
  ${GREEN}optimize${NC}    - Solo optimizar caché (config, routes, views)
  ${GREEN}rollback${NC}    - Revertir última migración
  ${GREEN}clean${NC}       - Limpiar toda la caché y archivos temporales
  ${GREEN}diagnose${NC}    - Ejecutar diagnóstico del sistema
  ${GREEN}help${NC}        - Mostrar esta ayuda

${YELLOW}Ejemplos:${NC}
  # Primera instalación
  ./deploy-cpanel.sh install

  # Actualizar aplicación existente
  ./deploy-cpanel.sh update

  # Solo ejecutar migraciones
  ./deploy-cpanel.sh migrate

${YELLOW}Notas:${NC}
  - Asegúrate de tener el archivo .env configurado antes de install
  - El script requiere permisos de ejecución: chmod +x deploy-cpanel.sh
  - Para update, se requiere Git configurado o subir archivos manualmente

EOF
}

################################################################################
# MAIN - Procesar argumentos
################################################################################

case "$1" in
    install)
        install
        ;;
    update)
        update
        ;;
    migrate)
        migrate
        ;;
    optimize)
        optimize
        ;;
    rollback)
        rollback
        ;;
    clean)
        clean
        ;;
    diagnose)
        diagnose
        ;;
    help|--help|-h)
        show_help
        ;;
    *)
        print_error "Opción no válida: $1"
        echo ""
        show_help
        exit 1
        ;;
esac

exit 0
