#!/bin/bash
# diagnose_lawfirm_mysql.sh - Diagnóstico completo de MySQL para lawfirm
# Uso: ./diagnose_lawfirm_mysql.sh [cpanel_user] [db_name] [db_user]

CPANEL_USER="${1:-lawfirm}"
DB_NAME="${2:-lawfirm_db}"
DB_USER="${3:-lawfirm_usr}"

echo "🔍 DIAGNÓSTICO COMPLETO DE MYSQL PARA $CPANEL_USER"
echo "=================================================="
echo ""

# 1. Verificar que el usuario cPanel existe
echo "1️⃣ Verificando usuario cPanel..."
CPANEL_USER_EXISTS=false
if whmapi1 listaccts searchtype=user search="$CPANEL_USER" 2>/dev/null | grep -q "\"user\": *\"$CPANEL_USER\""; then
    echo "   ✅ Usuario cPanel '$CPANEL_USER' existe"
    CPANEL_USER_EXISTS=true
else
    echo "   ⚠️  Usuario cPanel '$CPANEL_USER' NO existe (puede haber sido eliminado)"
    echo "   Continuando diagnóstico desde MySQL directamente..."
fi
echo ""

# 2. Verificar desde MySQL directamente PRIMERO (más confiable)
echo "2️⃣ Verificando desde MySQL directamente (como root):"
echo "   Usuarios MySQL que contienen '$CPANEL_USER':"
mysql_users=$(mysql -e "SELECT User, Host FROM mysql.user WHERE User LIKE '%${CPANEL_USER}%';" 2>/dev/null)
if [ $? -eq 0 ]; then
    if [ -n "$mysql_users" ] && [ "$(echo "$mysql_users" | wc -l)" -gt 1 ]; then
        echo "$mysql_users" | tail -n +2 | while read -r line; do
            echo "   - $line"
        done
    else
        echo "   ⚠️  No se encontraron usuarios MySQL con ese patrón"
    fi
else
    echo "   ❌ Error al conectar a MySQL como root"
fi
echo ""
echo "   Bases de datos que contienen '$CPANEL_USER':"
mysql_dbs=$(mysql -e "SHOW DATABASES LIKE '%${CPANEL_USER}%';" 2>/dev/null)
if [ $? -eq 0 ]; then
    if [ -n "$mysql_dbs" ] && [ "$(echo "$mysql_dbs" | wc -l)" -gt 1 ]; then
        echo "$mysql_dbs" | tail -n +2 | while read -r line; do
            echo "   - $line"
        done
    else
        echo "   ⚠️  No se encontraron bases de datos con ese patrón"
    fi
else
    echo "   ❌ Error al conectar a MySQL como root"
fi
echo ""

# 3. Listar usuarios MySQL desde cPanel API (solo si el usuario existe)
if [ "$CPANEL_USER_EXISTS" = true ]; then
    echo "3️⃣ Usuarios MySQL del usuario cPanel '$CPANEL_USER' (desde cPanel API):"
    echo "   ---"
    if command -v jq >/dev/null 2>&1; then
        users=$(uapi --user="$CPANEL_USER" Mysql list_users --output=json 2>/dev/null | jq -r '.data[]?.user // empty' 2>/dev/null)
        if [ -n "$users" ]; then
            echo "$users" | while read -r user; do
                echo "   - $user"
            done
        else
            echo "   ⚠️  No se encontraron usuarios MySQL"
        fi
    else
        users_raw=$(uapi --user="$CPANEL_USER" Mysql list_users 2>/dev/null)
        if echo "$users_raw" | grep -q "\"user\":"; then
            echo "$users_raw" | grep -oE "\"user\": *\"[^\"]+\"" | cut -d'"' -f4 | while read -r user; do
                echo "   - $user"
            done
        else
            echo "   ⚠️  No se encontraron usuarios MySQL o error al listar"
            echo "$users_raw" | head -5
        fi
    fi
    echo "   ---"
    echo ""

    # 4. Listar bases de datos desde cPanel API
    echo "4️⃣ Bases de datos MySQL del usuario cPanel '$CPANEL_USER' (desde cPanel API):"
    echo "   ---"
    if command -v jq >/dev/null 2>&1; then
        databases=$(uapi --user="$CPANEL_USER" Mysql list_databases --output=json 2>/dev/null | jq -r '.data[]?.database // empty' 2>/dev/null)
        if [ -n "$databases" ]; then
            echo "$databases" | while read -r db; do
                echo "   - $db"
            done
        else
            echo "   ⚠️  No se encontraron bases de datos MySQL"
        fi
    else
        dbs_raw=$(uapi --user="$CPANEL_USER" Mysql list_databases 2>/dev/null)
        if echo "$dbs_raw" | grep -q "\"database\":"; then
            echo "$dbs_raw" | grep -oE "\"database\": *\"[^\"]+\"" | cut -d'"' -f4 | while read -r db; do
                echo "   - $db"
            done
        else
            echo "   ⚠️  No se encontraron bases de datos o error al listar"
            echo "$dbs_raw" | head -5
        fi
    fi
    echo "   ---"
    echo ""
else
    echo "3️⃣ Saltando verificación desde cPanel API (usuario no existe)"
    echo ""
fi

# 5. Verificar privilegios del usuario MySQL desde MySQL directamente
echo "5️⃣ Verificando privilegios del usuario MySQL (desde MySQL):"
# Probar ambos nombres posibles
for test_user in "$DB_USER" "${CPANEL_USER}_${DB_USER}"; do
    echo "   Probando usuario: '$test_user'"
    grants=$(mysql -e "SHOW GRANTS FOR '${test_user}'@'localhost';" 2>&1)
    if echo "$grants" | grep -qi "ERROR 1141\|does not exist"; then
        echo "      ❌ Usuario '$test_user'@'localhost' no existe en MySQL"
    elif echo "$grants" | grep -qi "ERROR"; then
        echo "      ⚠️  Error al verificar: $(echo "$grants" | grep -i "ERROR" | head -1)"
    else
        echo "      ✅ Usuario '$test_user'@'localhost' existe"
        echo "$grants" | head -3 | while read -r grant_line; do
            echo "         $grant_line"
        done
    fi
done
echo ""

# 6. Verificar privilegios desde cPanel API (solo si el usuario existe)
if [ "$CPANEL_USER_EXISTS" = true ]; then
    echo "6️⃣ Verificando privilegios desde cPanel API:"
    for test_user in "$DB_USER" "${CPANEL_USER}_${DB_USER}"; do
        echo "   Probando usuario: '$test_user'"
        priv_result=$(uapi --user="$CPANEL_USER" Mysql get_user_privileges_on_database user="$test_user" database="$DB_NAME" 2>&1)
        if echo "$priv_result" | grep -qi "error\|not found\|does not exist"; then
            echo "      ❌ Usuario '$test_user' no encontrado o sin privilegios"
            echo "         Detalle: $(echo "$priv_result" | grep -i "error\|message" | head -1)"
        else
            echo "      ✅ Usuario '$test_user' encontrado"
            if command -v jq >/dev/null 2>&1; then
                privileges=$(echo "$priv_result" | jq -r '.data.privileges[]?' 2>/dev/null)
                if [ -n "$privileges" ]; then
                    echo "         Privilegios: $privileges"
                else
                    echo "         Privilegios: $(echo "$priv_result" | grep -i "privilege\|grant" | head -3)"
                fi
            else
                echo "         Privilegios: $(echo "$priv_result" | grep -i "privilege\|grant" | head -3 || echo 'N/A')"
            fi
        fi
    done
    echo ""
else
    echo "6️⃣ Saltando verificación de privilegios desde cPanel API (usuario no existe)"
    echo ""
fi

# 7. Obtener contraseña desde credenciales guardadas
echo "7️⃣ Contraseña guardada en /root/credenciales:"
if [ -f /root/credenciales ]; then
    # Buscar todas las líneas de contraseña para este usuario
    cred_lines=$(grep -A 20 "Cuenta cPanel: $CPANEL_USER" /root/credenciales | grep "Contraseña DB:" | head -1)
    if [ -n "$cred_lines" ]; then
        db_pass_cred=$(echo "$cred_lines" | cut -d: -f2- | sed 's/^ *//')
        db_user_cred=$(grep -A 20 "Cuenta cPanel: $CPANEL_USER" /root/credenciales | grep "Usuario DB:" | head -1 | cut -d: -f2 | tr -d ' ')

        if [ -n "$db_user_cred" ]; then
            echo "   Usuario DB guardado: $db_user_cred"
        fi

        if [ -n "$db_pass_cred" ]; then
            pass_length=${#db_pass_cred}
            if [ "$pass_length" -gt 50 ]; then
                echo "   ❌ Contraseña DB CORRUPTA: ${db_pass_cred:0:20}... (${pass_length} caracteres - IMPOSIBLE!)"
                echo "   ⚠️  El archivo de credenciales tiene entradas duplicadas o corruptas"
                echo "   💡 Solución: Ejecutar fix_lawfirm_mysql_password.sh para corregir"
            else
                echo "   Contraseña DB guardada: ${db_pass_cred:0:10}... (${pass_length} caracteres)"
            fi
        else
            echo "   ⚠️  No se encontró contraseña guardada"
        fi
    else
        echo "   ⚠️  No se encontraron credenciales para este usuario"
    fi

    # Mostrar cuántas veces aparece este usuario en el archivo
    user_count=$(grep -c "Cuenta cPanel: $CPANEL_USER" /root/credenciales 2>/dev/null || echo "0")
    if [ "$user_count" -gt 1 ]; then
        echo "   ⚠️  ADVERTENCIA: Este usuario aparece $user_count veces en el archivo (debería ser 1)"
        echo "   💡 Esto puede causar problemas al leer las credenciales"
    fi
else
    echo "   ⚠️  Archivo /root/credenciales no existe"
fi
echo ""

# 8. Verificar .env del proyecto
echo "8️⃣ Verificando archivo .env del proyecto:"
ENV_FILE="/home/$CPANEL_USER/public_html/bewpro-lawfirm/.env"
if [ -f "$ENV_FILE" ]; then
    echo "   Archivo: $ENV_FILE"
    echo "   ---"
    db_config=$(grep -E "^DB_" "$ENV_FILE")
    if [ -n "$db_config" ]; then
        echo "$db_config" | sed 's/PASSWORD=.*/PASSWORD=***/' | while read -r line; do
            echo "   $line"
        done
    else
        echo "   ⚠️  No se encontraron variables DB_ en el .env"
    fi
    echo "   ---"

    # Verificar contraseña completa (para debugging)
    env_password=$(grep "^DB_PASSWORD=" "$ENV_FILE" | cut -d= -f2)
    if [ -n "$env_password" ]; then
        echo "   Contraseña en .env: ${env_password:0:10}... (${#env_password} caracteres)"
    fi
else
    echo "   ❌ Archivo .env no existe en $ENV_FILE"
fi
echo ""

# 9. Probar conexión MySQL directamente
echo "9️⃣ Prueba de conexión MySQL:"
if [ -f /root/credenciales ]; then
    db_pass_cred=$(grep -A 10 "Cuenta cPanel: $CPANEL_USER" /root/credenciales | grep "Contraseña DB:" | cut -d: -f2 | tr -d ' ')
    if [ -n "$db_pass_cred" ]; then
        echo "   Probando conexión con usuario '$DB_USER'..."
        test_result1=$(mysql -u"$DB_USER" -p"$db_pass_cred" -h localhost "$DB_NAME" -e "SELECT 1 as test;" 2>&1)
        if [ $? -eq 0 ]; then
            echo "      ✅ Conexión exitosa con '$DB_USER'"
        else
            echo "      ❌ Conexión fallida con '$DB_USER'"
            echo "         Error: $(echo "$test_result1" | head -1)"
        fi

        echo "   Probando conexión con usuario '${CPANEL_USER}_${DB_USER}'..."
        test_result2=$(mysql -u"${CPANEL_USER}_${DB_USER}" -p"$db_pass_cred" -h localhost "$DB_NAME" -e "SELECT 1 as test;" 2>&1)
        if [ $? -eq 0 ]; then
            echo "      ✅ Conexión exitosa con '${CPANEL_USER}_${DB_USER}'"
        else
            echo "      ❌ Conexión fallida con '${CPANEL_USER}_${DB_USER}'"
            echo "         Error: $(echo "$test_result2" | head -1)"
        fi
    else
        echo "   ⚠️  No se encontró contraseña en credenciales para probar conexión"
    fi
else
    echo "   ⚠️  Archivo /root/credenciales no existe"
fi
echo ""

# 10. Verificar logs de creación
echo "🔟 Últimas líneas del log de creación:"
if [ -f /root/scripts/bulk_create_cpanel.log ]; then
    echo "   ---"
    tail -30 /root/scripts/bulk_create_cpanel.log | grep -E "$CPANEL_USER|MySQL|BD|database|Usuario|Contraseña" | tail -10 || echo "   No hay entradas relevantes"
    echo "   ---"
else
    echo "   ⚠️  Archivo de log no existe"
fi
echo ""

# 11. Resumen y recomendaciones
echo "1️⃣1️⃣ RESUMEN Y RECOMENDACIONES:"
echo "   ---"
echo "   Usuario cPanel: $CPANEL_USER"
echo "   Base de datos esperada: $DB_NAME"
echo "   Usuario MySQL esperado: $DB_USER o ${CPANEL_USER}_${DB_USER}"
echo ""
echo "   Para probar manualmente la conexión:"
echo "   1. Obtener contraseña:"
echo "      grep -A 10 'Cuenta cPanel: $CPANEL_USER' /root/credenciales | grep 'Contraseña DB:' | cut -d: -f2 | tr -d ' '"
echo ""
echo "   2. Probar conexión:"
echo "      mysql -u[USUARIO] -p[CONTRASEÑA] -h localhost $DB_NAME -e 'SELECT 1;'"
echo ""
echo "   3. Verificar desde cPanel:"
echo "      Acceder a cPanel del usuario y verificar en 'MySQL Databases'"
echo "   ---"
echo ""

echo "✅ Diagnóstico completado"

