#!/bin/bash
# Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0

# Importer les fonctions communes
source "$(dirname "$0")/../common/common_utils.sh"

# Vérifier si le script est exécuté en root
check_root

# Variables
NEW_PASS=$(generate_token 20)
DB_SERVICE="mariadb"  # Adapter si besoin
MYSQL_SOCK="/var/run/mysqld/mysqld.sock"
CNF_FILES=("/etc/mysql/debian.cnf" "/root/.my.cnf")
MYSQLD_SAFE_LOG="/tmp/mysqld_safe.log"

echo "[+] Nouveau mot de passe root généré."

# Arrêt du service MySQL/MariaDB
echo "[+] Arrêt du service $DB_SERVICE..."
systemctl stop "$DB_SERVICE"

echo "[+] Attente de l'arrêt complet du service..."
while systemctl is-active --quiet "$DB_SERVICE"; do
    sleep 1
done
echo "[+] Service arrêté."

# Nettoyage des éventuels sockets ou PID bloquants
echo "[+] Nettoyage des sockets et PID..."
rm -f /var/run/mysqld/mysqld.pid /var/run/mysqld/mysqld.sock

# Démarrage en mode sans échec
echo "[+] Démarrage de MySQL en mode sans échec..."
mysqld_safe --skip-grant-tables --skip-networking > "$MYSQLD_SAFE_LOG" 2>&1 &
SAFE_PID=$!

# Attente que mysqld_safe soit vraiment prêt
echo "[+] Attente de la disponibilité de mysqld_safe..."
for i in {1..10}; do
    if mysqladmin ping --socket="$MYSQL_SOCK" >/dev/null 2>&1; then
        echo "[+] mysqld_safe est prêt."
        break
    fi
    sleep 1
done

if ! mysqladmin ping --socket="$MYSQL_SOCK" >/dev/null 2>&1; then
    echo "[❌] Échec du démarrage de mysqld_safe. Voir $MYSQLD_SAFE_LOG"
    kill -9 $SAFE_PID 2>/dev/null
    exit 1
fi

# Réinitialisation du mot de passe root
echo "[+] Réinitialisation du mot de passe root..."
mysql --socket="$MYSQL_SOCK" <<EOF
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '$NEW_PASS';
FLUSH PRIVILEGES;
EOF

# Nettoyage complet du mode sans échec
echo "[+] Arrêt complet du mode sans échec et des processus MySQL/MariaDB..."
kill -9 $SAFE_PID
killall -9 mysqld_safe mariadbd mysqld || true
sleep 5

# Redémarrage du service
echo "[+] Redémarrage du service $DB_SERVICE..."
systemctl start "$DB_SERVICE"

# Vérification du bon démarrage
echo "[+] Attente du démarrage complet de MariaDB..."
for i in {1..10}; do
    if systemctl is-active --quiet "$DB_SERVICE"; then
        echo "[+] MariaDB est démarré."
        break
    fi
    sleep 1
done

if ! systemctl is-active --quiet "$DB_SERVICE"; then
    echo "[❌] MariaDB ne démarre pas. Voir journalctl -xeu $DB_SERVICE"
    systemctl status "$DB_SERVICE"
    exit 1
fi

# Test de connexion avec le nouveau mot de passe
echo "[+] Test de connexion réel avec le nouveau mot de passe root..."
if mysql -uroot -p"$NEW_PASS" -e "SELECT 'Connexion réussie' AS Status;" >/dev/null 2>&1; then
    echo "[✔] Connexion root réussie."

    # Mise à jour des fichiers .cnf si user = root
    for file in "${CNF_FILES[@]}"; do
        if [[ -f "$file" ]]; then
            if grep -q "^\s*user\s*=\s*root" "$file"; then
                echo "[+] Mise à jour du fichier $file (user=root détecté)."
                sed -i -E "s/(password\s*=\s*).*/\1$NEW_PASS/" "$file"
            else
                echo "[!] Pas de user=root dans $file, aucune modification."
            fi
        fi
    done

    echo "---------------------------------------------"
    echo "[✔] Mot de passe root MySQL/MariaDB réinitialisé avec succès."
    echo "[✔] Nouveau mot de passe root : $NEW_PASS"
    echo "---------------------------------------------"
else
    echo "[❌] Échec de la connexion root après redémarrage de MariaDB."
    exit 1
fi