#!/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

echo "=== Gestion du mot de passe administrateur ==="

# Vérifier la présence de la commande mysql
if ! command -v mysql >/dev/null 2>&1; then
    echo "❌ La commande 'mysql' est introuvable. Veuillez l'installer."
    exit 1
fi

# Fonction de recherche dans un fichier cnf ou conf
get_password_from_cnf() {
    local file=$1
    if [[ -f "$file" ]]; then
        PASSWORD=$(grep -m1 'password\s*=' "$file" | sed -E 's/.*password\s*=\s*//;s/"//g')
        if [[ -n "$PASSWORD" ]]; then
            echo "$PASSWORD"
            return 0
        fi
    fi
    return 1
}

# Tentative de récupération depuis /etc/mysql/debian.cnf
DB_ROOT_PASSWORD=$(get_password_from_cnf "/etc/mysql/debian.cnf")
if [[ -n "$DB_ROOT_PASSWORD" ]]; then
    echo "✅ Mot de passe root récupéré depuis /etc/mysql/debian.cnf"
else
    # Recherche dans d'autres fichiers .cnf ou .conf
    for file in /etc/mysql/*.cnf /etc/mysql/conf.d/*.cnf /etc/my.cnf /etc/my.cnf.d/*.cnf; do
        DB_ROOT_PASSWORD=$(get_password_from_cnf "$file")
        if [[ -n "$DB_ROOT_PASSWORD" ]]; then
            echo "✅ Mot de passe root trouvé dans $file"
            break
        fi
    done
fi

# Si toujours rien, demande à l'utilisateur
if [[ -z "$DB_ROOT_PASSWORD" ]]; then
    echo -n "🔐 Entrez le mot de passe root pour MariaDB : "
    read -r -s USER_PASSWORD
    echo
    DB_ROOT_PASSWORD="$USER_PASSWORD"
fi

# Création d'un fichier temporaire sécurisé pour la connexion MySQL
TEMP_CNF=$(mktemp)
chmod 600 "$TEMP_CNF"
cat > "$TEMP_CNF" <<EOF
[client]
user=root
password=$DB_ROOT_PASSWORD
EOF

# TEST du mot de passe root
echo "🔎 Test de connexion avec le mot de passe root..."
if ! mysql --defaults-extra-file="$TEMP_CNF" -e "SELECT 1;" 2>/dev/null; then
    echo "❌ Échec de la connexion avec le mot de passe root. Arrêt du script."
    rm -f "$TEMP_CNF"
    exit 1
fi
echo "✅ Connexion root réussie."

# Définir la variable MYSQL_CMD pour le reste du script
MYSQL_CMD="mysql --defaults-extra-file=$TEMP_CNF"

# N'oublie pas de prévoir un nettoyage à la fin :
trap 'rm -f "$TEMP_CNF"' EXIT

echo "=== Création d'une nouvelle base de données MariaDB ==="

# Lecture du nom de la base de données
read -rp "Nom de la base de données : " DB_NAME
if [[ -z "$DB_NAME" ]]; then
    echo "❌ Nom de base de données requis."
    rm -f "$TEMP_CNF"
    exit 1
fi

# Vérification de l'existence de la base de données
DB_EXISTS=$(mysql --defaults-extra-file="$TEMP_CNF" -sse "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$DB_NAME'")
if [[ "$DB_EXISTS" == "$DB_NAME" ]]; then
    echo "❌ La base de données '$DB_NAME' existe déjà."
    rm -f "$TEMP_CNF"
    exit 1
fi

# Lecture du nom de l'utilisateur
read -rp "Nom de l'utilisateur : " DB_USER
if [[ -z "$DB_USER" ]]; then
    echo "❌ Nom d'utilisateur requis."
    rm -f "$TEMP_CNF"
    exit 1
fi

# Vérification de l'existence de l'utilisateur
USER_EXISTS=$(mysql --defaults-extra-file="$TEMP_CNF" -sse "SELECT COUNT(*) FROM mysql.user WHERE user='$DB_USER'")
if [[ "$USER_EXISTS" -gt 0 ]]; then
    echo "ℹ️ L'utilisateur '$DB_USER' existe déjà. Il ne sera pas recréé."
    CREATE_USER_SQL=""
    USER_PASS_TO_SAVE=""
else
    echo "✅ L'utilisateur '$DB_USER' sera créé."
    # Demande du mot de passe utilisateur ou génération
    read -rsp "Mot de passe de l'utilisateur (laisser vide pour générer) : " DB_PASS
    echo
    if [[ -z "$DB_PASS" ]]; then
        DB_PASS=$(generate_token 64)
        echo "🔑 Mot de passe généré : $DB_PASS"
    fi
    CREATE_USER_SQL="CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
    USER_PASS_TO_SAVE="$DB_PASS"
fi

# Création de la base et attribution des droits
SQL=$(cat <<EOF
CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
$CREATE_USER_SQL
GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'localhost';
FLUSH PRIVILEGES;
EOF
)

echo "✅ Exécution de la création..."
if mysql --defaults-extra-file="$TEMP_CNF" -e "$SQL"; then
    echo "🎉 Base de données '$DB_NAME' créée et droits attribués à '$DB_USER'."
else
    echo "❌ Erreur lors de la création."
    rm -f "$TEMP_CNF"
    exit 1
fi

# Sauvegarde des identifiants
if [[ -n "$USER_PASS_TO_SAVE" ]]; then
  TIMESTAMP=$(date +%Y%m%d%H%M%S)
  CRED_FILE="db_${DB_NAME}_${TIMESTAMP}.credentials"

  umask 077  # Restriction immédiate des droits sur le fichier
  {
    printf "Base: %s\n" "$DB_NAME"
    printf "User: %s\n" "$DB_USER"
    printf "Password: %s\n" "$USER_PASS_TO_SAVE"
  } > "$CRED_FILE"

  echo "🔒 Identifiants sauvegardés dans $CRED_FILE"
fi

# Nettoyage du fichier temporaire de connexion
rm -f "$TEMP_CNF"
