#!/bin/bash

###############################################
# cPanel Migration Tool - Script de Instalación
# Versión 1.0.1 MEJORADO
###############################################

set -e

# 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 con color
print_status() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

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

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

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

# Verificar si se ejecuta como root
if [[ $EUID -ne 0 ]]; then
   print_error "Este script debe ejecutarse como root (sudo)"
   exit 1
fi

print_status "Iniciando instalación de cPanel Migration Tool..."

# Obtener ruta de instalación
INSTALL_PATH="${1:-.}"
if [[ ! -d "$INSTALL_PATH" ]]; then
    print_error "La ruta de instalación no existe: $INSTALL_PATH"
    exit 1
fi

cd "$INSTALL_PATH"
print_success "Ruta de instalación: $INSTALL_PATH"

# ====================================
# 1. Verificar requisitos
# ====================================
print_status "Verificando requisitos del sistema..."

# PHP
if ! command -v php &> /dev/null; then
    print_error "PHP no está instalado"
    exit 1
fi

PHP_VERSION=$(php -r 'echo PHP_VERSION;')
print_success "PHP encontrado: $PHP_VERSION"

# Verificar extensiones PHP
REQUIRED_EXTENSIONS=("curl" "openssl" "json" "pdo" "pdo_mysql")
for ext in "${REQUIRED_EXTENSIONS[@]}"; do
    if ! php -m | grep -q "^$ext\$"; then
        print_error "Extensión PHP requerida no encontrada: $ext"
        exit 1
    fi
done
print_success "Todas las extensiones PHP requeridas están disponibles"

# MySQL/MariaDB
if ! command -v mysql &> /dev/null; then
    print_error "MySQL/MariaDB no está instalado"
    exit 1
fi
print_success "MySQL/MariaDB encontrado"

# ====================================
# 2. Crear directorios
# ====================================
print_status "Creando directorios..."

mkdir -p "$INSTALL_PATH/temp"
mkdir -p "$INSTALL_PATH/logs"
mkdir -p "$INSTALL_PATH/classes"
mkdir -p "$INSTALL_PATH/config"
mkdir -p "$INSTALL_PATH/database"
mkdir -p "$INSTALL_PATH/public/api"
mkdir -p "$INSTALL_PATH/public/assets/css"
mkdir -p "$INSTALL_PATH/public/assets/js"

chmod 750 "$INSTALL_PATH/temp"
chmod 750 "$INSTALL_PATH/logs"
chmod 755 "$INSTALL_PATH/classes"
chmod 755 "$INSTALL_PATH/config"

print_success "Directorios creados"

# ====================================
# 3. Configurar archivo .env
# ====================================
print_status "Configurando archivo .env..."

if [[ -f ".env" ]]; then
    print_warning ".env ya existe. Haciendo backup..."
    cp .env ".env.backup.$(date +%s)"
else
    print_status "Creando archivo .env desde .env.example..."
    if [[ ! -f ".env.example" ]]; then
        print_error ".env.example no encontrado"
        exit 1
    fi
    cp .env.example .env
    chmod 600 .env
    print_success "Archivo .env creado"
fi

# Generar clave de encriptación aleatoria si es necesario
if grep -q "ENCRYPTION_KEY=tu_clave_aleatoria" .env; then
    print_status "Generando clave de encriptación segura..."
    ENCRYPTION_KEY=$(openssl rand -hex 32)
    sed -i "s|ENCRYPTION_KEY=tu_clave_aleatoria_de_32_caracteres_aqui|ENCRYPTION_KEY=$ENCRYPTION_KEY|" .env
    print_success "Clave de encriptación generada"
fi

# Pedir información de base de datos
print_status ""
print_status "Configuración de Base de Datos"
print_status "================================"

read -p "Host MySQL [localhost]: " DB_HOST
DB_HOST=${DB_HOST:-localhost}

read -p "Nombre de base de datos [cpanel_migration]: " DB_NAME
DB_NAME=${DB_NAME:-cpanel_migration}

read -p "Usuario MySQL (no usar root) [migration_user]: " DB_USER
DB_USER=${DB_USER:-migration_user}

read -sp "Contraseña MySQL: " DB_PASS
echo ""

# Actualizar .env con datos de BD
sed -i "s|DB_HOST=.*|DB_HOST=$DB_HOST|" .env
sed -i "s|DB_NAME=.*|DB_NAME=$DB_NAME|" .env
sed -i "s|DB_USER=.*|DB_USER=$DB_USER|" .env
sed -i "s|DB_PASS=.*|DB_PASS=$DB_PASS|" .env

print_success "Configuración de BD actualizada en .env"

# ====================================
# 4. Crear usuario MySQL
# ====================================
print_status "Configurando usuario MySQL..."

read -sp "Contraseña de MySQL root (para crear usuario): " ROOT_PASS
echo ""

# Crear usuario de BD
mysql -h "$DB_HOST" -u root -p"$ROOT_PASS" <<EOF
CREATE DATABASE IF NOT EXISTS $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';
GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost';
FLUSH PRIVILEGES;
EOF

print_success "Usuario MySQL creado"

# ====================================
# 5. Importar schema
# ====================================
print_status "Importando esquema de base de datos..."

SCHEMA_FILE="$INSTALL_PATH/database/schema.sql"
if [[ ! -f "$SCHEMA_FILE" ]]; then
    print_error "Archivo schema.sql no encontrado"
    exit 1
fi

mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" < "$SCHEMA_FILE"
print_success "Esquema de BD importado"

# ====================================
# 6. Establecer permisos
# ====================================
print_status "Estableciendo permisos de archivos..."

# Obtener usuario de web server
if command -v apache2ctl &> /dev/null; then
    WEB_USER="www-data"
    print_status "Servidor web detectado: Apache"
elif command -v nginx &> /dev/null; then
    WEB_USER="nginx"
    print_status "Servidor web detectado: Nginx"
else
    WEB_USER="www-data"
    print_warning "No se detectó servidor web, usando www-data por defecto"
fi

chown -R "$WEB_USER:$WEB_USER" "$INSTALL_PATH"
chmod 755 "$INSTALL_PATH"
chmod 755 "$INSTALL_PATH/public"
chmod 755 "$INSTALL_PATH/classes"
chmod 755 "$INSTALL_PATH/config"
chmod 750 "$INSTALL_PATH/temp"
chmod 750 "$INSTALL_PATH/logs"
chmod 600 "$INSTALL_PATH/.env"

print_success "Permisos establecidos correctamente"

# ====================================
# 7. Verificar instalación
# ====================================
print_status "Verificando instalación..."

# Test de conexión a BD
PHP_TEST=$(php -r "
require '$INSTALL_PATH/config/config.php';
try {
    \$db = Database::getInstance();
    echo 'OK';
} catch (Exception \$e) {
    echo 'ERROR: ' . \$e->getMessage();
}
")

if [[ "$PHP_TEST" == "OK" ]]; then
    print_success "Conexión a base de datos verificada"
else
    print_error "Error en conexión a base de datos: $PHP_TEST"
    exit 1
fi

# ====================================
# Finalización
# ====================================
print_status ""
print_success "╔════════════════════════════════════════╗"
print_success "║  Instalación completada exitosamente   ║"
print_success "╚════════════════════════════════════════╝"
print_status ""
print_status "Próximos pasos:"
print_status "1. Revisar el archivo .env y ajustar configuración si es necesario"
print_status "2. Configurar el servidor web (Apache/Nginx) para servir $INSTALL_PATH/public"
print_status "3. Acceder a: https://tu-dominio.com/migration"
print_status ""
print_warning "IMPORTANTE:"
print_warning "- Cambiar APP_URL en .env a tu dominio real"
print_warning "- Usar HTTPS en producción"
print_warning "- Cambiar timezone en .env si es necesario"
print_warning "- Revisar los permisos de los directorios /temp y /logs"
print_status ""
