#!/bin/bash
# ============================================================================
# LIMPIOO — Script de autoconfiguración de base de datos y entorno
# ============================================================================
# Ejecutar como root:  sudo bash database/setup.sh
#
# Qué hace:
#   1. Configura zona horaria de MySQL → Europe/Madrid
#   2. Configura zona horaria de PHP   → Europe/Madrid
#   3. Carga tablas de timezone en MySQL (necesario para CONVERT_TZ)
#   4. Crea la BD maestra (limpioo) desde admin/v2.0/database.sql
#   5. Crea una BD de tenant (limpioo_userdb_N) desde application/v2.0/database.sql
#   6. Crea el usuario de aplicación con permisos
#   7. Reinicia servicios
#
# Requisitos:
#   - MySQL/MariaDB instalado
#   - PHP 8.x con Apache instalado
#   - Acceso root a MySQL (o usuario con GRANT OPTION)
# ============================================================================

set -e

# ── Colores ──────────────────────────────────────────────────────────────────
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'

# ── Rutas ────────────────────────────────────────────────────────────────────
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ADMIN_SQL="$SCRIPT_DIR/admin/v2.0/database.sql"
TENANT_SQL="$SCRIPT_DIR/application/v2.0/database.sql"

TIMEZONE="Europe/Madrid"

# ── Funciones auxiliares ─────────────────────────────────────────────────────
ok()   { echo -e "   ${GREEN}✅ $1${NC}"; }
warn() { echo -e "   ${YELLOW}⚠️  $1${NC}"; }
fail() { echo -e "   ${RED}❌ $1${NC}"; }
step() { echo -e "\n${BLUE}[$1] $2${NC}"; }

header() {
    echo ""
    echo -e "${CYAN}============================================================${NC}"
    echo -e "${CYAN}   LIMPIOO — Autoconfiguración de base de datos${NC}"
    echo -e "${CYAN}   $(date)${NC}"
    echo -e "${CYAN}============================================================${NC}"
}

# ── Verificaciones previas ───────────────────────────────────────────────────
header

# Verificar que se ejecuta como root
if [[ $EUID -ne 0 ]]; then
    fail "Este script debe ejecutarse como root (sudo bash database/setup.sh)"
    exit 1
fi

# Verificar que los SQL existen
if [[ ! -f "$ADMIN_SQL" ]]; then
    fail "No se encontró $ADMIN_SQL"
    exit 1
fi
if [[ ! -f "$TENANT_SQL" ]]; then
    fail "No se encontró $TENANT_SQL"
    exit 1
fi

# Verificar que MySQL está activo
if ! command -v mysql &>/dev/null; then
    fail "MySQL/MariaDB no está instalado"
    exit 1
fi

if ! systemctl is-active --quiet mysql 2>/dev/null && ! systemctl is-active --quiet mariadb 2>/dev/null; then
    fail "MySQL/MariaDB no está activo"
    exit 1
fi

ok "MySQL/MariaDB detectado y activo"

# ── Credenciales de MySQL root ───────────────────────────────────────────────
echo ""
echo -e "${YELLOW}Credenciales de MySQL root (para crear BDs y usuarios):${NC}"
read -p "   Usuario root MySQL [root]: " MYSQL_ROOT_USER
MYSQL_ROOT_USER="${MYSQL_ROOT_USER:-root}"

read -sp "   Contraseña root MySQL (vacío si usa socket): " MYSQL_ROOT_PASS
echo ""

# Construir comando mysql base
if [[ -z "$MYSQL_ROOT_PASS" ]]; then
    MYSQL_CMD="mysql -u $MYSQL_ROOT_USER"
else
    MYSQL_CMD="mysql -u $MYSQL_ROOT_USER -p$MYSQL_ROOT_PASS"
fi

# Verificar conexión
if ! $MYSQL_CMD -e "SELECT 1" &>/dev/null; then
    fail "No se pudo conectar a MySQL con las credenciales proporcionadas"
    exit 1
fi
ok "Conexión a MySQL verificada"

# ── Credenciales del usuario de aplicación ───────────────────────────────────
echo ""
echo -e "${YELLOW}Credenciales del usuario de aplicación (el que usa PHP):${NC}"
read -p "   Usuario de la aplicación [newuser]: " APP_USER
APP_USER="${APP_USER:-newuser}"

read -sp "   Contraseña del usuario de la aplicación: " APP_PASS
echo ""

if [[ -z "$APP_PASS" ]]; then
    fail "La contraseña del usuario de aplicación no puede estar vacía"
    exit 1
fi

# ── Nombre de la BD tenant ───────────────────────────────────────────────────
echo ""
read -p "   Nombre de la BD tenant a crear [limpioo_userdb_1]: " TENANT_DB
TENANT_DB="${TENANT_DB:-limpioo_userdb_1}"

# ═══════════════════════════════════════════════════════════════════════════
# PASO 1: Zona horaria de MySQL
# ═══════════════════════════════════════════════════════════════════════════
step "1/6" "Configurando zona horaria de MySQL → $TIMEZONE"

# Cargar tablas de timezone
if mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | $MYSQL_CMD mysql &>/dev/null; then
    ok "Tablas de timezone cargadas en MySQL"
else
    warn "No se pudieron cargar tablas de timezone (pueden ya existir)"
fi

# Detectar archivo de configuración de MariaDB/MySQL
MYSQL_CNF=""
for candidate in \
    /etc/mysql/mariadb.conf.d/50-server.cnf \
    /etc/mysql/mysql.conf.d/mysqld.cnf \
    /etc/mysql/my.cnf \
    /etc/my.cnf; do
    if [[ -f "$candidate" ]]; then
        MYSQL_CNF="$candidate"
        break
    fi
done

if [[ -n "$MYSQL_CNF" ]]; then
    # Verificar si ya tiene la configuración
    if grep -q "^default-time-zone" "$MYSQL_CNF" 2>/dev/null; then
        # Reemplazar valor existente
        sed -i "s/^default-time-zone.*/default-time-zone = '$TIMEZONE'/" "$MYSQL_CNF"
        ok "Actualizado default-time-zone en $MYSQL_CNF"
    else
        # Añadir debajo de [mysqld]
        if grep -q '^\[mysqld\]' "$MYSQL_CNF"; then
            sed -i "/^\[mysqld\]/a default-time-zone = '$TIMEZONE'" "$MYSQL_CNF"
            ok "Añadido default-time-zone en $MYSQL_CNF (sección [mysqld])"
        else
            echo -e "\n[mysqld]\ndefault-time-zone = '$TIMEZONE'" >> "$MYSQL_CNF"
            ok "Añadida sección [mysqld] con default-time-zone en $MYSQL_CNF"
        fi
    fi
else
    warn "No se encontró archivo de configuración de MySQL. Configura manualmente: default-time-zone = '$TIMEZONE'"
fi

# Aplicar en caliente
$MYSQL_CMD -e "SET GLOBAL time_zone = '$TIMEZONE';" 2>/dev/null && \
    ok "Zona horaria aplicada en caliente (SET GLOBAL)" || \
    warn "No se pudo aplicar en caliente (se aplicará al reiniciar)"

# ═══════════════════════════════════════════════════════════════════════════
# PASO 2: Zona horaria de PHP
# ═══════════════════════════════════════════════════════════════════════════
step "2/6" "Configurando zona horaria de PHP → $TIMEZONE"

PHP_CHANGED=0
for ini in /etc/php/*/apache2/php.ini /etc/php/*/cli/php.ini /etc/php/*/cgi/php.ini /etc/php/*/fpm/php.ini; do
    if [[ -f "$ini" ]]; then
        if grep -q "^date.timezone" "$ini"; then
            sed -i "s/^date.timezone.*/date.timezone = $TIMEZONE/" "$ini"
        elif grep -q "^;date.timezone" "$ini"; then
            sed -i "s/^;date.timezone.*/date.timezone = $TIMEZONE/" "$ini"
        else
            echo "date.timezone = $TIMEZONE" >> "$ini"
        fi
        ok "$(echo "$ini" | sed 's|/etc/php/||')"
        PHP_CHANGED=1
    fi
done

if [[ $PHP_CHANGED -eq 0 ]]; then
    warn "No se encontraron archivos php.ini. Configura manualmente: date.timezone = $TIMEZONE"
fi

# ═══════════════════════════════════════════════════════════════════════════
# PASO 3: Crear BD maestra (limpioo)
# ═══════════════════════════════════════════════════════════════════════════
step "3/6" "Creando BD maestra desde admin/v2.0/database.sql"

if $MYSQL_CMD < "$ADMIN_SQL" 2>/dev/null; then
    ok "BD 'limpioo' creada/verificada correctamente"
else
    fail "Error al importar admin/v2.0/database.sql"
    exit 1
fi

# ═══════════════════════════════════════════════════════════════════════════
# PASO 4: Crear BD tenant
# ═══════════════════════════════════════════════════════════════════════════
step "4/6" "Creando BD tenant '$TENANT_DB' desde application/v2.0/database.sql"

$MYSQL_CMD -e "CREATE DATABASE IF NOT EXISTS \`$TENANT_DB\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" 2>/dev/null
ok "Base de datos '$TENANT_DB' creada/verificada"

$MYSQL_CMD "$TENANT_DB" < "$TENANT_SQL" 2>/dev/null && \
    ok "Tablas de tenant importadas en '$TENANT_DB'" || \
    { fail "Error al importar application/v2.0/database.sql en '$TENANT_DB'"; exit 1; }

# ═══════════════════════════════════════════════════════════════════════════
# PASO 5: Crear usuario de aplicación
# ═══════════════════════════════════════════════════════════════════════════
step "5/6" "Configurando usuario de aplicación '$APP_USER'"

$MYSQL_CMD -e "
    CREATE USER IF NOT EXISTS '$APP_USER'@'localhost' IDENTIFIED BY '$APP_PASS';
    GRANT ALL PRIVILEGES ON \`limpioo\`.* TO '$APP_USER'@'localhost';
    GRANT ALL PRIVILEGES ON \`${TENANT_DB}\`.* TO '$APP_USER'@'localhost';
    GRANT ALL PRIVILEGES ON \`limpioo_userdb_%\`.* TO '$APP_USER'@'localhost';
    FLUSH PRIVILEGES;
" 2>/dev/null && \
    ok "Usuario '$APP_USER' configurado con permisos" || \
    { fail "Error al crear/configurar usuario '$APP_USER'"; exit 1; }

# ═══════════════════════════════════════════════════════════════════════════
# PASO 6: Reiniciar servicios
# ═══════════════════════════════════════════════════════════════════════════
step "6/6" "Reiniciando servicios"

# MySQL/MariaDB
if systemctl restart mariadb 2>/dev/null || systemctl restart mysql 2>/dev/null; then
    ok "MySQL/MariaDB reiniciado"
else
    warn "No se pudo reiniciar MySQL (reinicia manualmente)"
fi

# Apache
if systemctl restart apache2 2>/dev/null; then
    ok "Apache reiniciado"
elif systemctl restart httpd 2>/dev/null; then
    ok "Apache (httpd) reiniciado"
else
    warn "No se pudo reiniciar Apache (reinicia manualmente)"
fi

# ═══════════════════════════════════════════════════════════════════════════
# VERIFICACIÓN FINAL
# ═══════════════════════════════════════════════════════════════════════════
echo ""
echo -e "${CYAN}────────────────────────────────────────────────────────────${NC}"
echo -e "${CYAN}   Verificación final${NC}"
echo -e "${CYAN}────────────────────────────────────────────────────────────${NC}"

# Verificar timezone MySQL
MYSQL_TZ=$($MYSQL_CMD -N -e "SELECT @@global.time_zone;" 2>/dev/null)
if [[ "$MYSQL_TZ" == "$TIMEZONE" ]]; then
    ok "MySQL time_zone = $MYSQL_TZ"
else
    warn "MySQL time_zone = $MYSQL_TZ (esperado: $TIMEZONE)"
fi

# Verificar NOW() devuelve hora española
MYSQL_NOW=$($MYSQL_CMD -N -e "SELECT NOW();" 2>/dev/null)
ok "MySQL NOW() = $MYSQL_NOW"

# Verificar PHP timezone
PHP_TZ=$(php -r "echo date_default_timezone_get();" 2>/dev/null)
if [[ "$PHP_TZ" == "$TIMEZONE" ]]; then
    ok "PHP timezone = $PHP_TZ"
else
    warn "PHP timezone = $PHP_TZ (esperado: $TIMEZONE — reinicia Apache)"
fi

# Verificar tablas en BD maestra
ADMIN_TABLES=$($MYSQL_CMD -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='limpioo';" 2>/dev/null)
ok "BD 'limpioo': $ADMIN_TABLES tablas"

# Verificar tablas en BD tenant
TENANT_TABLES=$($MYSQL_CMD -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$TENANT_DB';" 2>/dev/null)
ok "BD '$TENANT_DB': $TENANT_TABLES tablas"

# Verificar conexión con usuario de aplicación
if mysql -u "$APP_USER" -p"$APP_PASS" -e "SELECT 1" &>/dev/null; then
    ok "Conexión con usuario '$APP_USER' verificada"
else
    warn "No se pudo conectar con '$APP_USER' (verifica credenciales)"
fi

# ── Resumen ──────────────────────────────────────────────────────────────────
echo ""
echo -e "${CYAN}============================================================${NC}"
echo -e "${GREEN}   CONFIGURACIÓN COMPLETADA${NC}"
echo -e "${CYAN}============================================================${NC}"
echo ""
echo "   Zona horaria:  $TIMEZONE"
echo "   BD maestra:    limpioo"
echo "   BD tenant:     $TENANT_DB"
echo "   Usuario app:   $APP_USER@localhost"
echo ""
echo "   Para crear BDs tenant adicionales:"
echo "     mysql -u root -p -e \"CREATE DATABASE limpioo_userdb_N\""
echo "     mysql -u root -p limpioo_userdb_N < $TENANT_SQL"
echo ""
