#!/bin/bash

#===========================================================================================================
# Script: LimpiarInstalacionLAMP.sh
# Descripción: Limpia instalaciones fallidas de LAMP y resetea el sistema
# Autor: Sistema de Instalación API
# Fecha: 2025
#===========================================================================================================

# Colores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
BOLD='\033[1m'

# Funciones de utilidad
print_header() {
    echo ""
    echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    echo -e "${BOLD}${CYAN}   $1${NC}"
    echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    echo ""
}

print_success() { echo -e "${GREEN}✓${NC} $1"; }
print_error() { echo -e "${RED}✗${NC} $1"; }
print_warning() { echo -e "${YELLOW}⚠${NC} $1"; }
print_info() { echo -e "${BLUE}ℹ${NC} $1"; }

#===========================================================================================================
# VERIFICAR PERMISOS Y UBUNTU
#===========================================================================================================

if [ "$EUID" -ne 0 ]; then
    print_error "Este script debe ejecutarse como root"
    echo -e "${YELLOW}Usa: sudo bash $0${NC}"
    exit 1
fi

# Información del sistema
UBUNTU_VERSION=$(lsb_release -rs)
UBUNTU_MAJOR=$(echo "$UBUNTU_VERSION" | cut -d. -f1)

if [[ "$UBUNTU_MAJOR" -lt 20 ]]; then
    print_error "Script no compatible con Ubuntu < 20.04"
    exit 1
fi

#===========================================================================================================
# ADVERTENCIAS Y CONFIRMACIÓN
#===========================================================================================================

clear
echo -e "${RED}╔════════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${RED}║                                                                    ║${NC}"
echo -e "${RED}║              ⚠️  LIMPIEZA DE INSTALACIÓN LAMP  ⚠️                 ║${NC}"
echo -e "${RED}║                                                                    ║${NC}"
echo -e "${RED}╚════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}Este script realizará las siguientes acciones:${NC}"
echo ""
echo -e "  ${CYAN}1.${NC} Detener procesos bloqueados"
echo -e "  ${CYAN}2.${NC} Limpiar locks de apt/dpkg"
echo -e "  ${CYAN}3.${NC} Eliminar archivos temporales de Composer"
echo -e "  ${CYAN}4.${NC} Resetear configuraciones de MySQL"
echo -e "  ${CYAN}5.${NC} Eliminar Apache (opcional)"
echo -e "  ${CYAN}6.${NC} Eliminar versiones de PHP (opcional)"
echo -e "  ${CYAN}7.${NC} Liberar puertos ocupados"
echo -e "  ${CYAN}8.${NC} Limpiar caché de sistema"
echo ""
echo -e "${RED}ADVERTENCIA:${NC} Este script puede eliminar Apache, MySQL, MariaDB y PHP."
echo -e "            Elige qué componentes deseas eliminar en cada paso."
echo ""

read -p "¿Deseas continuar con la limpieza? [s/N]: " CONFIRM
if [[ ! "$CONFIRM" =~ ^[sS]$ ]]; then
    print_warning "Operación cancelada por el usuario"
    exit 0
fi

#===========================================================================================================
# LIMPIEZA DE PROCESOS
#===========================================================================================================

print_header "Paso 1: Limpiando procesos bloqueados"

# Matar procesos de apt/dpkg
print_info "Deteniendo procesos de apt/dpkg..."
killall apt apt-get dpkg 2>/dev/null && print_success "Procesos apt detenidos" || print_info "No hay procesos apt activos"

# Matar procesos de composer colgados
print_info "Buscando procesos de Composer..."
if pgrep -f composer > /dev/null; then
    killall composer 2>/dev/null
    print_success "Procesos de Composer detenidos"
else
    print_info "No hay procesos de Composer activos"
fi

# Matar procesos de git colgados
print_info "Buscando procesos de Git..."
if pgrep -f "git clone" > /dev/null; then
    killall git 2>/dev/null
    print_success "Procesos de Git detenidos"
else
    print_info "No hay procesos de Git activos"
fi

sleep 2

#===========================================================================================================
# LIMPIEZA DE LOCKS
#===========================================================================================================

print_header "Paso 2: Limpiando locks del sistema"

print_info "Eliminando locks de apt/dpkg..."
rm -f /var/lib/apt/lists/lock 2>/dev/null && print_success "Lock de apt/lists eliminado"
rm -f /var/cache/apt/archives/lock 2>/dev/null && print_success "Lock de apt/cache eliminado"
rm -f /var/lib/dpkg/lock* 2>/dev/null && print_success "Locks de dpkg eliminados"

print_info "Reconfigurando dpkg..."
if dpkg --configure -a 2>/dev/null; then
    print_success "Dpkg reconfigurado"
else
    print_warning "Dpkg ya estaba configurado"
fi

#===========================================================================================================
# LIMPIEZA DE COMPOSER
#===========================================================================================================

print_header "Paso 3: Limpiando archivos de Composer"

# Eliminar composer.phar de ubicaciones comunes
COMPOSER_LOCATIONS=(
    "/root/composer.phar"
    "$HOME/composer.phar"
    "/tmp/composer.phar"
    "composer.phar"
)

for location in "${COMPOSER_LOCATIONS[@]}"; do
    if [ -f "$location" ]; then
        rm -f "$location"
        print_success "Eliminado: $location"
    fi
done

# Limpiar caché de Composer
print_info "Limpiando caché de Composer..."
if [ -d "$HOME/.composer/cache" ]; then
    rm -rf "$HOME/.composer/cache"
    print_success "Caché de Composer eliminada"
fi

if [ -d "/root/.composer/cache" ]; then
    rm -rf "/root/.composer/cache"
    print_success "Caché de Composer root eliminada"
fi

# Verificar si composer está instalado
if command -v composer &> /dev/null; then
    COMPOSER_PATH=$(which composer)
    print_warning "Composer encontrado en: $COMPOSER_PATH"

    read -p "¿Deseas eliminar el Composer instalado? [s/N]: " DELETE_COMPOSER
    if [[ "$DELETE_COMPOSER" =~ ^[sS]$ ]]; then
        rm -f "$COMPOSER_PATH"
        rm -f /usr/local/bin/composer
        print_success "Composer eliminado"
    else
        print_info "Composer conservado (puede estar corrupto)"
    fi
else
    print_info "Composer no está instalado"
fi

#===========================================================================================================
# LIMPIEZA DE DIRECTORIOS DE APLICACIÓN
#===========================================================================================================

print_header "Paso 4: Revisando directorios de aplicación"

APP_DIRS=(
    "/var/www/apidian"
    "/var/www/html/apidian"
    "/opt/apidian"
    "/root/apidian"
    "/root/setup"
)

FOUND_DIRS=()
for dir in "${APP_DIRS[@]}"; do
    if [ -d "$dir" ]; then
        FOUND_DIRS+=("$dir")
    fi
done

if [ ${#FOUND_DIRS[@]} -gt 0 ]; then
    echo ""
    echo -e "${YELLOW}Directorios de aplicación encontrados:${NC}"
    for dir in "${FOUND_DIRS[@]}"; do
        print_warning "  - $dir"
    done
    echo ""
    read -p "¿Deseas eliminar TODOS estos directorios? [s/N]: " DELETE_ALL

    if [[ "$DELETE_ALL" =~ ^[sS]$ ]]; then
        for dir in "${FOUND_DIRS[@]}"; do
            rm -rf "$dir"
            print_success "Eliminado: $dir"
        done
    else
        print_info "Directorios conservados"
    fi
else
    print_info "No se encontraron directorios de aplicación"
fi

#===========================================================================================================
# LIMPIEZA DE MYSQL/MARIADB
#===========================================================================================================

print_header "Paso 5: Limpiando MySQL/MariaDB"

# Detectar si hay MySQL o MariaDB instalado
MYSQL_INSTALLED=false
MARIADB_INSTALLED=false

if dpkg -l | grep -q "mysql-server"; then
    MYSQL_INSTALLED=true
    print_warning "MySQL Server detectado"
fi

if dpkg -l | grep -q "mariadb-server"; then
    MARIADB_INSTALLED=true
    print_warning "MariaDB Server detectado"
fi

if [ "$MYSQL_INSTALLED" = true ] || [ "$MARIADB_INSTALLED" = true ]; then
    echo ""
    echo -e "${YELLOW}Se detectó MySQL/MariaDB instalado${NC}"
    echo -e "${RED}ADVERTENCIA: Esta acción eliminará TODA la base de datos${NC}"
    echo ""
    read -p "¿Deseas ELIMINAR completamente MySQL/MariaDB? [s/N]: " REMOVE_DB

    if [[ "$REMOVE_DB" =~ ^[sS]$ ]]; then
        print_info "Deteniendo servicios de base de datos..."
        systemctl stop mysql 2>/dev/null
        systemctl stop mariadb 2>/dev/null

        print_info "Eliminando paquetes de MySQL..."
        apt-get purge -y mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-* 2>/dev/null

        print_info "Eliminando paquetes de MariaDB..."
        apt-get purge -y mariadb-server mariadb-client mariadb-common mariadb-server-core-* mariadb-client-core-* 2>/dev/null

        print_info "Eliminando archivos de configuración y datos..."
        rm -rf /var/lib/mysql
        rm -rf /var/lib/mysql-files
        rm -rf /var/lib/mysql-keyring
        rm -rf /etc/mysql
        rm -rf /var/log/mysql

        print_info "Limpiando paquetes huérfanos..."
        apt-get autoremove -y 2>/dev/null
        apt-get autoclean -y 2>/dev/null

        print_success "MySQL/MariaDB completamente eliminado"
    else
        print_info "MySQL/MariaDB conservado"

        # Si no se elimina, verificar bases de datos
        if systemctl is-active --quiet mysql 2>/dev/null || systemctl is-active --quiet mariadb 2>/dev/null; then
            print_info "Bases de datos existentes:"
            mysql -e "SHOW DATABASES;" 2>/dev/null | grep -v "Database\|information_schema\|performance_schema\|mysql\|sys" | while read db; do
                echo "  - $db"
            done

            echo ""
            read -p "¿Deseas eliminar alguna base de datos específica? [s/N]: " DELETE_DB
            if [[ "$DELETE_DB" =~ ^[sS]$ ]]; then
                read -p "Nombre de la base de datos a eliminar: " DB_NAME
                if [ -n "$DB_NAME" ]; then
                    mysql -e "DROP DATABASE IF EXISTS $DB_NAME;" 2>/dev/null
                    print_success "Base de datos '$DB_NAME' eliminada"
                fi
            fi
        fi
    fi
else
    print_info "No hay MySQL/MariaDB instalado"
fi

#===========================================================================================================
# LIMPIEZA DE APACHE
#===========================================================================================================

print_header "Paso 6: Limpiando Apache"

# Detectar si hay Apache instalado
if dpkg -l | grep -q "apache2"; then
    print_warning "Apache2 detectado"
    echo ""
    echo -e "${YELLOW}Se detectó Apache instalado${NC}"
    echo -e "${RED}ADVERTENCIA: Esto eliminará Apache y sus configuraciones${NC}"
    echo ""
    read -p "¿Deseas ELIMINAR completamente Apache? [s/N]: " REMOVE_APACHE

    if [[ "$REMOVE_APACHE" =~ ^[sS]$ ]]; then
        print_info "Deteniendo Apache..."
        systemctl stop apache2 2>/dev/null

        print_info "Eliminando paquetes de Apache..."
        apt-get purge -y apache2 apache2-utils apache2-bin apache2-data 2>/dev/null

        print_info "Eliminando archivos de configuración..."
        rm -rf /etc/apache2
        rm -rf /var/log/apache2
        rm -rf /var/www/html

        print_info "Limpiando paquetes huérfanos..."
        apt-get autoremove -y 2>/dev/null

        print_success "Apache completamente eliminado"
    else
        print_info "Apache conservado"
    fi
else
    print_info "No hay Apache instalado"
fi

#===========================================================================================================
# LIMPIEZA DE PHP
#===========================================================================================================

print_header "Paso 7: Limpiando PHP"

# Detectar versiones de PHP instaladas
PHP_VERSIONS=()
for version in 7.0 7.1 7.2 7.3 7.4 8.0 8.1 8.2 8.3; do
    if dpkg -l | grep -q "php${version}"; then
        PHP_VERSIONS+=("$version")
    fi
done

if [ ${#PHP_VERSIONS[@]} -gt 0 ]; then
    print_warning "Se encontraron las siguientes versiones de PHP:"
    for version in "${PHP_VERSIONS[@]}"; do
        echo "  - PHP $version"
    done

    echo ""
    echo -e "${YELLOW}Opciones:${NC}"
    echo "  1) Eliminar TODAS las versiones de PHP"
    echo "  2) Eliminar versiones específicas"
    echo "  3) Conservar PHP"
    echo ""
    read -p "Selecciona una opción [1/2/3]: " PHP_OPTION

    case $PHP_OPTION in
        1)
            # Eliminar todas las versiones
            print_info "Eliminando todas las versiones de PHP..."

            for version in "${PHP_VERSIONS[@]}"; do
                print_info "Deteniendo php${version}-fpm..."
                systemctl stop php${version}-fpm 2>/dev/null

                print_info "Eliminando PHP $version..."
                apt-get purge -y php${version}* 2>/dev/null

                print_success "PHP $version eliminado"
            done

            print_info "Limpiando paquetes huérfanos..."
            apt-get autoremove -y 2>/dev/null

            print_success "Todas las versiones de PHP han sido eliminadas"
            ;;
        2)
            # Eliminar versiones específicas
            echo ""
            echo -e "${CYAN}Versiones de PHP disponibles:${NC}"
            for i in "${!PHP_VERSIONS[@]}"; do
                echo "  $((i+1))) PHP ${PHP_VERSIONS[$i]}"
            done
            echo "  $((${#PHP_VERSIONS[@]}+1))) Cancelar"
            echo ""
            read -p "Selecciona la versión a eliminar (número): " PHP_SELECT

            if [ "$PHP_SELECT" -le ${#PHP_VERSIONS[@]} ] && [ "$PHP_SELECT" -ge 1 ]; then
                PHP_TO_REMOVE="${PHP_VERSIONS[$((PHP_SELECT-1))]}"

                print_info "Eliminando PHP $PHP_TO_REMOVE..."
                systemctl stop php${PHP_TO_REMOVE}-fpm 2>/dev/null
                apt-get purge -y php${PHP_TO_REMOVE}* 2>/dev/null

                print_info "Limpiando paquetes huérfanos..."
                apt-get autoremove -y 2>/dev/null

                print_success "PHP $PHP_TO_REMOVE eliminado"
            else
                print_info "Operación cancelada"
            fi
            ;;
        3)
            print_info "PHP conservado"
            ;;
        *)
            print_warning "Opción no válida"
            ;;
    esac
else
    print_info "No hay versiones de PHP instaladas"
fi

#===========================================================================================================
# LIMPIEZA DE PUERTOS
#===========================================================================================================

print_header "Paso 8: Verificando puertos"

print_info "Puertos en uso:"
netstat -tlnp | grep -E ':(80|443|3306|8080)' | awk '{print $4, $7}' || print_info "No se encontraron puertos ocupados"

#===========================================================================================================
# LIMPIEZA DE CACHÉ DEL SISTEMA
#===========================================================================================================

print_header "Paso 9: Limpiando caché del sistema"

print_info "Limpiando caché de apt..."
apt-get clean 2>/dev/null && print_success "Caché de apt limpiada"

print_info "Actualizando índice de paquetes..."
apt-get update -qq 2>/dev/null && print_success "Índice actualizado" || print_warning "Error al actualizar índice"

#===========================================================================================================
# VERIFICACIÓN FINAL
#===========================================================================================================

print_header "Verificación Final"

echo -e "${CYAN}Estado del Sistema:${NC}"
echo ""

# Verificar servicios
echo -e "${BOLD}Servicios:${NC}"
systemctl is-active --quiet apache2 && echo -e "  ${GREEN}✓${NC} Apache2: Activo" || echo -e "  ${YELLOW}○${NC} Apache2: Inactivo"
systemctl is-active --quiet mysql && echo -e "  ${GREEN}✓${NC} MySQL: Activo" || echo -e "  ${YELLOW}○${NC} MySQL: Inactivo"

echo ""
echo -e "${BOLD}Software Instalado:${NC}"
command -v php &> /dev/null && echo -e "  ${GREEN}✓${NC} PHP: $(php -v | head -n1 | cut -d' ' -f2)" || echo -e "  ${RED}✗${NC} PHP: No instalado"
command -v composer &> /dev/null && echo -e "  ${GREEN}✓${NC} Composer: $(composer --version 2>/dev/null | grep -oP '\d+\.\d+\.\d+' | head -n1)" || echo -e "  ${RED}✗${NC} Composer: No instalado"
command -v git &> /dev/null && echo -e "  ${GREEN}✓${NC} Git: $(git --version | cut -d' ' -f3)" || echo -e "  ${RED}✗${NC} Git: No instalado"

echo ""
echo -e "${BOLD}Espacio en Disco:${NC}"
df -h / | tail -1 | awk '{print "  Usado: "$3" / "$2" ("$5")"}'

echo ""
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}✓ Limpieza completada exitosamente${NC}"
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
print_info "Puedes ejecutar nuevamente el script de instalación"
echo ""
