#!/usr/bin/env bash
# Script para crear manualmente usuario MySQL y asignar privilegios
# Uso: ./fix-mysql-user.sh <cpanel_user> [db_name] [db_user] [db_pass]

set -euo pipefail

if [ $# -lt 1 ]; then
  echo "Uso: $0 <cpanel_user> [db_name] [db_user] [db_pass]"
  echo ""
  echo "Ejemplo:"
  echo "  $0 lawfirm"
  echo "  $0 lawfirm lawfirm_db lawfirm_usr 'password123'"
  exit 1
fi

CPANEL_USER="$1"
DB_NAME="${2:-${CPANEL_USER}_db}"
DB_USER="${3:-${CPANEL_USER}_usr}"
DB_PASS="${4:-$(openssl rand -base64 12 | tr -d '/+=' | cut -c1-14)}"

echo "🔧 Reparando usuario MySQL para $CPANEL_USER"
echo "   Base de datos: $DB_NAME"
echo "   Usuario: $DB_USER"
echo "   Contraseña: $DB_PASS"
echo ""

# Verificar que el usuario cPanel existe
if ! whmapi1 listaccts searchtype=user search="$CPANEL_USER" | grep -q "\"user\": *\"$CPANEL_USER\""; then
  echo "❌ Error: El usuario cPanel $CPANEL_USER no existe"
  exit 1
fi

# Verificar que la base de datos existe
echo "🔍 Verificando base de datos..."
DB_EXISTS=$(uapi --user="$CPANEL_USER" Mysql list_databases 2>&1 | grep -i "\"$DB_NAME\"" || true)
if [ -z "$DB_EXISTS" ]; then
  echo "❌ Error: La base de datos $DB_NAME no existe"
  echo "💡 Creando base de datos..."
  uapi --user="$CPANEL_USER" Mysql create_database name="$DB_NAME" || {
    echo "❌ Error al crear la base de datos"
    exit 1
  }
  echo "✅ Base de datos $DB_NAME creada"
else
  echo "✅ Base de datos $DB_NAME existe"
fi

# Verificar si el usuario ya existe
echo "🔍 Verificando usuario MySQL..."
USER_EXISTS=$(uapi --user="$CPANEL_USER" Mysql list_users 2>&1 | grep -i "\"$DB_USER\"" || true)

if [ -n "$USER_EXISTS" ]; then
  echo "⚠️  El usuario $DB_USER ya existe"
  read -p "¿Deseas eliminarlo y recrearlo? (s/n): " -n 1 -r
  echo
  if [[ $REPLY =~ ^[Ss]$ ]]; then
    echo "🗑️  Eliminando usuario existente..."
    uapi --user="$CPANEL_USER" Mysql delete_user name="$DB_USER" || {
      echo "❌ Error al eliminar usuario (puede que tenga privilegios asignados)"
      echo "💡 Intentando eliminar privilegios primero..."
      uapi --user="$CPANEL_USER" Mysql set_privileges_on_database user="$DB_USER" database="$DB_NAME" privileges="" 2>/dev/null || true
      uapi --user="$CPANEL_USER" Mysql delete_user name="$DB_USER" || {
        echo "❌ No se pudo eliminar el usuario. Puede que necesites hacerlo manualmente desde cPanel"
        exit 1
      }
    }
    echo "✅ Usuario eliminado"
    sleep 1
  else
    echo "⚠️  Manteniendo usuario existente"
    DB_USER_EXISTING="$DB_USER"
  fi
fi

# Crear usuario si no existe
if [ -z "$USER_EXISTS" ] || [[ $REPLY =~ ^[Ss]$ ]]; then
  echo "👤 Creando usuario MySQL..."
  
  # Intentar crear usuario
  USER_RESULT=$(uapi --user="$CPANEL_USER" Mysql create_user name="$DB_USER" password="$DB_PASS" 2>&1)
  
  if [ $? -ne 0 ]; then
    echo "❌ Error al crear usuario: $USER_RESULT"
    
    # Intentar con formato sin prefijo
    DB_USER_ALT="${DB_USER#${CPANEL_USER}_}"
    if [ "$DB_USER_ALT" != "$DB_USER" ] && [ "$DB_USER_ALT" != "" ]; then
      echo "💡 Intentando con formato alternativo: $DB_USER_ALT"
      USER_RESULT=$(uapi --user="$CPANEL_USER" Mysql create_user name="$DB_USER_ALT" password="$DB_PASS" 2>&1)
      if [ $? -eq 0 ]; then
        echo "✅ Usuario creado con formato alternativo: $DB_USER_ALT"
        DB_USER="$DB_USER_ALT"
      else
        echo "❌ Error también con formato alternativo: $USER_RESULT"
        exit 1
      fi
    else
      exit 1
    fi
  else
    echo "✅ Usuario $DB_USER creado correctamente"
  fi
fi

# Asignar privilegios
echo "🔐 Asignando privilegios..."
PRIV_RESULT=$(uapi --user="$CPANEL_USER" Mysql set_privileges_on_database user="$DB_USER" database="$DB_NAME" privileges=ALL 2>&1)

if [ $? -ne 0 ]; then
  echo "❌ Error al asignar privilegios: $PRIV_RESULT"
  exit 1
else
  echo "✅ Privilegios ALL asignados correctamente"
fi

# Mostrar resumen
echo ""
echo "✅ Usuario MySQL configurado correctamente:"
echo "   Base de datos: $DB_NAME"
echo "   Usuario: $DB_USER"
echo "   Contraseña: $DB_PASS"
echo ""
echo "📝 Actualiza el archivo .env con estas credenciales:"
echo "   DB_DATABASE=$DB_NAME"
echo "   DB_USERNAME=$DB_USER"
echo "   DB_PASSWORD=$DB_PASS"
echo "   DB_HOST=localhost"
echo "   DB_PORT=3306"

