#!/usr/bin/env bash
# ============================================================
#  Qullqi Wasi — Instalador Linux (QA / Producción)
#  Ubuntu 22.04 LTS | Apache 2.4 | PHP 8.3 | MySQL 8.0
#
#  Uso:
#    sudo bash instalar.sh              # QA (depuracion=true)
#    sudo bash instalar.sh --produccion # Producción (depuracion=false)
#    sudo bash instalar.sh --solo-bd    # Solo recrea la BD
# ============================================================

set -euo pipefail

# ── Colores ───────────────────────────────────────────────────
VERDE='\033[0;32m'
AMARILLO='\033[1;33m'
ROJO='\033[0;31m'
AZUL='\033[0;34m'
RESET='\033[0m'
BOLD='\033[1m'

# ── Configuración ─────────────────────────────────────────────
APP_DIR="/var/www/html/qullqi_wasi"
DB_NAME="qullqi_wasi_db"
DB_USER="root"
DB_PASS=""          # Ajustar según el ambiente
WEB_USER="www-data"
PRODUCCION=false
SOLO_BD=false

# ── Parsear argumentos ────────────────────────────────────────
for arg in "$@"; do
    case $arg in
        --produccion) PRODUCCION=true ;;
        --solo-bd)    SOLO_BD=true ;;
    esac
done

# ── Banner ────────────────────────────────────────────────────
echo -e "${AZUL}${BOLD}"
echo "  ╔══════════════════════════════════════════════╗"
echo "  ║      Qullqi Wasi — Instalador Linux          ║"
if $PRODUCCION; then
echo "  ║           Modo: PRODUCCIÓN                   ║"
else
echo "  ║           Modo: QA / Desarrollo              ║"
fi
echo "  ╚══════════════════════════════════════════════╝"
echo -e "${RESET}"

# ── Verificar root ────────────────────────────────────────────
if [[ $EUID -ne 0 ]]; then
    echo -e "${ROJO}[ERROR] Este script debe ejecutarse como root (sudo).${RESET}"
    exit 1
fi

# ── Función log ───────────────────────────────────────────────
log()    { echo -e "${VERDE}[✔]${RESET} $1"; }
warn()   { echo -e "${AMARILLO}[!]${RESET} $1"; }
error()  { echo -e "${ROJO}[✘]${RESET} $1"; exit 1; }
step()   { echo -e "\n${AZUL}${BOLD}[$1]${RESET} $2"; }

# ── Detectar directorio del script ────────────────────────────
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
RAIZ="$(dirname "$SCRIPT_DIR")"
SQL_FILE="$RAIZ/database/qullqi_wasi_base_datos.sql"

# ── Modo solo-bd ──────────────────────────────────────────────
if $SOLO_BD; then
    step "BD" "Recreando base de datos..."
    if [[ -z "$DB_PASS" ]]; then
        mysql -u"$DB_USER" -e "DROP DATABASE IF EXISTS \`$DB_NAME\`;"
        mysql -u"$DB_USER" < "$SQL_FILE"
    else
        mysql -u"$DB_USER" -p"$DB_PASS" -e "DROP DATABASE IF EXISTS \`$DB_NAME\`;"
        mysql -u"$DB_USER" -p"$DB_PASS" < "$SQL_FILE"
    fi

    # Regenerar hashes
    HASH_ADMIN=$(php8.3 -r "echo password_hash('Admin2026*', PASSWORD_BCRYPT, ['cost'=>10]);")
    HASH_DEMO=$(php8.3  -r "echo password_hash('Demo2026*',  PASSWORD_BCRYPT, ['cost'=>10]);")
    if [[ -z "$DB_PASS" ]]; then
        mysql -u"$DB_USER" "$DB_NAME" -e "UPDATE usuarios SET contrasena_hash='$HASH_ADMIN' WHERE nombre_usuario='admin';"
        mysql -u"$DB_USER" "$DB_NAME" -e "UPDATE usuarios SET contrasena_hash='$HASH_DEMO'  WHERE nombre_usuario='coleccionista.demo';"
    else
        mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "UPDATE usuarios SET contrasena_hash='$HASH_ADMIN' WHERE nombre_usuario='admin';"
        mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "UPDATE usuarios SET contrasena_hash='$HASH_DEMO'  WHERE nombre_usuario='coleccionista.demo';"
    fi
    log "Base de datos recreada con datos de prueba."
    exit 0
fi

# ── 1. Prerrequisitos ─────────────────────────────────────────
step "1/7" "Instalando prerrequisitos del sistema..."
apt-get update -qq
apt-get install -y -qq apache2 php8.3 php8.3-mysql php8.3-mbstring \
    php8.3-json php8.3-gd php8.3-fileinfo php8.3-xml \
    libapache2-mod-php8.3 mysql-server unzip rsync
log "Paquetes instalados"

# ── 2. Apache ─────────────────────────────────────────────────
step "2/7" "Configurando Apache..."
a2enmod rewrite headers expires 2>/dev/null || true
systemctl enable apache2 --quiet
systemctl start  apache2

# Virtual Host si es producción
if $PRODUCCION; then
    cat > /etc/apache2/sites-available/qullqi_wasi.conf <<'VHOST'
<VirtualHost *:80>
    DocumentRoot /var/www/html/qullqi_wasi/public
    <Directory /var/www/html/qullqi_wasi/public>
        AllowOverride All
        Require all granted
        Options -Indexes
    </Directory>
    ErrorLog  ${APACHE_LOG_DIR}/qullqi_wasi_error.log
    CustomLog ${APACHE_LOG_DIR}/qullqi_wasi_access.log combined
</VirtualHost>
VHOST
    a2ensite qullqi_wasi.conf 2>/dev/null || true
fi

systemctl reload apache2
log "Apache configurado"

# ── 3. MySQL ──────────────────────────────────────────────────
step "3/7" "Configurando MySQL..."
systemctl enable mysql --quiet
systemctl start  mysql

# ── 4. Base de datos ──────────────────────────────────────────
step "4/7" "Importando base de datos..."
if [[ ! -f "$SQL_FILE" ]]; then
    error "No se encontró el archivo SQL: $SQL_FILE"
fi

if [[ -z "$DB_PASS" ]]; then
    mysql -u"$DB_USER" < "$SQL_FILE"
else
    mysql -u"$DB_USER" -p"$DB_PASS" < "$SQL_FILE"
fi
log "Esquema importado"

# Generar hashes reales
COSTO=10
if $PRODUCCION; then COSTO=12; fi

HASH_ADMIN=$(php8.3 -r "echo password_hash('Admin2026*', PASSWORD_BCRYPT, ['cost'=>$COSTO]);")
HASH_DEMO=$(php8.3  -r "echo password_hash('Demo2026*',  PASSWORD_BCRYPT, ['cost'=>$COSTO]);")

if [[ -z "$DB_PASS" ]]; then
    mysql -u"$DB_USER" "$DB_NAME" -e "UPDATE usuarios SET contrasena_hash='$HASH_ADMIN' WHERE nombre_usuario='admin';"
    mysql -u"$DB_USER" "$DB_NAME" -e "UPDATE usuarios SET contrasena_hash='$HASH_DEMO'  WHERE nombre_usuario='coleccionista.demo';"
else
    mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "UPDATE usuarios SET contrasena_hash='$HASH_ADMIN' WHERE nombre_usuario='admin';"
    mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "UPDATE usuarios SET contrasena_hash='$HASH_DEMO'  WHERE nombre_usuario='coleccionista.demo';"
fi
log "Contraseñas actualizadas (bcrypt cost=$COSTO)"

# ── 5. Archivos de la app ─────────────────────────────────────
step "5/7" "Copiando archivos de la aplicación..."
if [[ "$RAIZ" != "$APP_DIR" ]]; then
    cp -r "$RAIZ" /var/www/html/ 2>/dev/null || true
fi
log "Archivos en $APP_DIR"

# ── 6. Permisos ───────────────────────────────────────────────
step "6/7" "Configurando permisos..."
chown -R "$WEB_USER:$WEB_USER" "$APP_DIR"
chmod -R 755 "$APP_DIR"
chmod -R 775 "$APP_DIR/storage"
chmod -R 775 "$APP_DIR/public/uploads"

# Crear directorios si no existen
mkdir -p "$APP_DIR/storage/logs" \
         "$APP_DIR/storage/uploads" \
         "$APP_DIR/storage/backups" \
         "$APP_DIR/public/uploads"
chown -R "$WEB_USER:$WEB_USER" "$APP_DIR/storage" "$APP_DIR/public/uploads"
log "Permisos aplicados"

# ── 7. Configuración de ambiente ─────────────────────────────
step "7/7" "Ajustando configuración del ambiente..."
CONFIG_FILE="$APP_DIR/config/aplicacion.php"

if $PRODUCCION; then
    sed -i "s/'depuracion'   => true/'depuracion'   => false/" "$CONFIG_FILE" 2>/dev/null || true
    warn "Recuerda actualizar url_base en config/aplicacion.php con tu dominio real."
    warn "Actualiza la contraseña de MySQL en config/base_datos.php para producción."
fi

# Cron para respaldo automático en QA/Producción
CRON_LINE="0 2 * * * $WEB_USER bash $APP_DIR/scripts/respaldar.sh >> $APP_DIR/storage/logs/respaldo.log 2>&1"
if ! grep -q "respaldar.sh" /etc/crontab 2>/dev/null; then
    echo "$CRON_LINE" >> /etc/crontab
    log "Cron de respaldo configurado (02:00 AM diario)"
fi

# ── Resumen ───────────────────────────────────────────────────
echo ""
echo -e "${VERDE}${BOLD}"
echo "  ╔══════════════════════════════════════════════════════════╗"
echo "  ║  ✔  Instalación completada con éxito                    ║"
echo "  ║                                                          ║"
if $PRODUCCION; then
echo "  ║  URL: https://tu-dominio.com                             ║"
else
IP=$(hostname -I | awk '{print $1}')
echo "  ║  URL: http://$IP/qullqi_wasi/public          ║"
fi
echo "  ║                                                          ║"
echo "  ║  Usuarios de prueba:                                     ║"
echo "  ║    admin              / Admin2026*  (Administrador)      ║"
echo "  ║    coleccionista.demo / Demo2026*   (Coleccionista)      ║"
echo "  ╚══════════════════════════════════════════════════════════╝"
echo -e "${RESET}"
