#!/bin/bash

# === CONFIGURATION UTILISATEUR ===

export PATH="$PATH:/opt/alt/alt-nodejs16/root/usr/bin/"
USERNAME=$(whoami)
RAND_NUM=$((1 + RANDOM % 9999))
DB_PREFIX="wp"
DB_PASSWORD=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9-_[](){}' | fold -w 16 | head -n 1)
DB_NAME=$USERNAME'_wpaoi'$RAND_NUM
DB_USER=$DB_NAME
WP_ARCHIVE="latest-fr_FR.zip"
WP_DIR="wordpress"
WORKDIR="wpress"
INSTALL_WORDPRESS=true
INSTALL_DATABASE=true
EXTRACT_ONLY=false
WPRESS_FILE=""
PWD=$(pwd)

TXT_ERROR="[\e[0;31mERROR\e[0;0m]"
TXT_INFO="[\e[0;33mINFO\e[0;0m]"
TXT_OK="[\e[0;32mOK\e[0;0m]"

show_help() {
  echo "o2switch .wpress installer"
  echo "2025, Stéphane Nanty"
  echo "with code snippets from Olivier and Alexis, THXALOT"
  echo
  echo "Restore .wpress to a working WordPress instance."
  echo  
  echo "This tool is used to restore WordPress from an AIO .wpress file"
  echo "Usage : $0 file.wpress [options]"
  echo
  echo "Available options :"
  echo "  --help, -h           Show this help menu"
  echo "  --extract-only       Extract only the .wpress archive"
  echo "  --no-wordpress       Don't install the Word"
  echo "  --no-database        Don't install the database"
  echo "  --prefix=XXX         Specify a database prefix (défaut : wp)"
  echo
  echo "Exemple :"
  echo "  $0 site.wpress --prefix=wp"
  echo
  exit 0
}

# === VÉRIFICATIONS DES DÉPENDANCES ===

check_command() {
  command -v "$1" > /dev/null 2>&1 || {
    echo -e "$TXT_ERROR La commande '$1' est requise mais introuvable."
    exit 1
  }
}

# === GESTION DES OPTIONS ===
for arg in "$@"; do
  case $arg in
    -h|--help)
      show_help
      ;;
    --extract-only)
      EXTRACT_ONLY=true
      ;;
    --no-wordpress)
      INSTALL_WORDPRESS=false
      ;;
    --no-database)
      INSTALL_DATABASE=false
      ;;
    --prefix=*)
      DB_PREFIX="${arg#*=}"
      ;;
    
    *.wpress)
      WPRESS_FILE="$arg"
      ;;
    *)
      echo -e "$TXT_ERROR Unknown option : $arg"
      show_help
      exit 1
      ;;
  esac
done

echo -e "\e[0;31mEmplacement d'installation: $PWD\e[0;0m"
read -p "Appuyez pour continuer. Ctrl+C pour annuler !"

for cmd in npx uapi mysql wget unzip; do
  check_command "$cmd"
done

# === ÉTAPE 1 : EXTRACTION DU FICHIER .wpress ===
if [[ -z "$WPRESS_FILE" ]]; then
  echo -e "$TXT_ERROR Aucun fichier .wpress spécifié."
  echo -e "$TXT_INFO Utilisez --help pour plus d'informations."
  exit 1
fi
echo -e "$TXT_INFO Extraction du fichier $WPRESS_FILE..."
npx wpress-extract "$WPRESS_FILE" -o "$WORKDIR" || {
  echo -e "$TXT_ERROR Échec de l'extraction."; exit 1;
}
if $EXTRACT_ONLY; then
  echo -e "$TXT_OK Extraction terminée. Mode extract-only activé, fin du script."
  exit 0
fi

# === ÉTAPE 2 : CRÉATION DE LA BASE DE DONNÉES ET DE L'UTILISATEUR ===

if $INSTALL_DATABASE; then
  echo -e "$TXT_INFO Création de la base de données $DB_NAME..."
  uapi Mysql create_database name="$DB_NAME" | grep -q "status: 1" || {
    echo -e "$TXT_ERROR Échec de la création de la base de données."
    exit 1
  }
  echo -e "$TXT_INFO Création de l'utilisateur MySQL $DB_USER..."
  uapi Mysql create_user name="$DB_USER" password="$DB_PASSWORD" | grep -q "status: 1" || {
    echo -e "$TXT_ERROR Échec de la création de l'utilisateur MySQL."
    exit 1
  }

  echo -e "$TXT_INFO Attribution de tous les privilèges à $DB_USER sur $DB_NAME..."
  uapi Mysql set_privileges_on_database user="$DB_USER" database="$DB_NAME" privileges=ALL | grep -q "status: 1" || {
    echo -e "$TXT_ERROR Échec lors de l’attribution des privilèges."
    exit 1
  }

# === ÉTAPE 3 : RECHERCHE ET IMPORT DU FICHIER .sql ===

  SQL_FILE=$(find ./$WORKDIR -type f -name "*.sql" | head -n 1)

  if [ -z "$SQL_FILE" ]; then
    echo -e "$TXT_ERROR Aucun fichier .sql trouvé dans l'archive extraite."
    exit 1
  fi
  sed -i 's/SERVMASK_PREFIX/'$DB_PREFIX'/g' "$SQL_FILE"

  echo -e "$TXT_INFO Import du fichier SQL $SQL_FILE dans la base $DB_NAME..."
  mysql -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < "$SQL_FILE" || { 
    echo "$TXT_ERROR Importation SQL échouée."; head -n 10 "$SQL_FILE"; exit 1; }
fi

# === ÉTAPE 4 : INSTALLATION DE WORDPRESS ===
if $INSTALL_WORDPRESS; then

  echo -e "$TXT_INFO Téléchargement de Wordpress..."
  wget --no-check-certificate https://fr.wordpress.org/$WP_ARCHIVE -O $WP_ARCHIVE || {
    echo -e "$TXT_ERROR Téléchargement échoué."
    exit 1
  }
  echo -e "$TXT_INFO Extraction de l'archive..."
  unzip -q $WP_ARCHIVE || {
    echo -e "$TXT_ERROR Échec de l'extraction de WordPress."
    exit 1
  }

  echo -e "$TXT_INFO Modification des droits par $USERNAME..."
  chown -R "$USERNAME:$USERNAME" "$WP_DIR"
  chown -R "$USERNAME:$USERNAME" "$WORKDIR"
  yes | cp -vaR "$WP_DIR/"* .
  rm -rf "$WP_DIR" "$WP_ARCHIVE"
  yes | cp -vaR "$WORKDIR/"* ./wp-content
  rm -rf "$WORKDIR"
  cp "wp-config-sample.php" "wp-config.php"
  if $INSTALL_DATABASE; then
    sed -i "/DB_HOST/s/'[^']*'/\'localhost\'/2" "wp-config.php"
    sed -i "/DB_NAME/s/'[^']*'/\'$DB_NAME\'/2" "wp-config.php"
    sed -i "/DB_USER/s/'[^']*'/\'$DB_USER\'/2" "wp-config.php"
    sed -i "/DB_PASSWORD/s/'[^']*'/\'$DB_PASSWORD\'/2" "wp-config.php"
    sed -i "/\$table_prefix = /s/'[^']*'/\'$DB_PREFIX\'/2" "wp-config.php"
  fi
fi

# === ÉTAPE 5 : HTACCESS D'OLIVIER ===

wget https://dl.shiigen.fr/htaccess.zip
unzip htaccess.zip 
rm htaccess.zip

# === ÉTAPE FINALE : AFFICHAGE DES INFOS ===
echo -e "\n$TXT_OK Restauration terminée avec succès !"
if $INSTALL_DATABASE; then
  echo "------------------------------------------"
  echo "Base de données : $DB_NAME"
  echo "Utilisateur      : $DB_USER"
  echo "Mot de passe     : $DB_PASSWORD"
  echo "------------------------------------------"
fi

rm $0