#!/bin/bash
# Mise à jour d'alchimistes.fr : PrestaShop 1.7.6.0 -> 1.7.8.11 (testée sur la copie le 9 octobre 2026).
# Fichiers à envoyer avant dans ~/maj-1.7.8.11/ : ce script, prestashop_1.7.8.11.zip, autoupgrade-v4.14.4.zip, executer-sql.php, maintenance-*.sql
# Étapes :  bash ~/maj-1.7.8.11/maj-prestashop.sh verifier   (ne change rien)
#           bash ~/maj-1.7.8.11/maj-prestashop.sh go         (sauvegardes, maintenance, mise à jour)
#           bash ~/maj-1.7.8.11/maj-prestashop.sh retour     (remet la sauvegarde du jour si ça a échoué)
M=~/maj-1.7.8.11
B=~/alchimistes.fr
S=~/sauvegardes; mkdir -p "$S"
cd "$B" || exit 1
ADMIN=$(for d in */; do [ -f "$d/init.php" ] && [ -f "$d/ajax.php" ] && [ -d "$d/themes" ] && echo "${d%/}"; done | head -1)
V=$(grep -o "VERSION = '[0-9.]*'" app/AppKernel.php | grep -o "[0-9][0-9.]*")
# Identifiants de la base lus dans la boutique (nom public du serveur : le nom « privatesql » ne marche pas en SSH)
eval "$(php -r '$p=(include "'"$B"'/app/config/parameters.php")["parameters"]; echo "H=".escapeshellarg(str_replace(".privatesql",".eu.clouddb.ovh.net",$p["database_host"]))." P=".escapeshellarg($p["database_port"])." U=".escapeshellarg($p["database_user"])." BASE=".escapeshellarg($p["database_name"])." MYSQL_PWD=".escapeshellarg($p["database_password"]);')"
export MYSQL_PWD

case "$1" in
verifier)
  echo "version actuelle : $V (attendu 1.7.6.0)"
  echo "dossier d'administration : ${ADMIN:-INTROUVABLE}"
  php -v | head -1
  echo "base : $(mysql -h "$H" -P "$P" -u "$U" "$BASE" -N -e 'SELECT value FROM ps_configuration WHERE name="PS_VERSION_DB"' 2>&1)"
  for f in prestashop_1.7.8.11.zip autoupgrade-v4.14.4.zip executer-sql.php maintenance-debut.sql maintenance-fin.sql; do [ -f "$M/$f" ] && echo "ok : $f" || echo "MANQUE : $f"; done
  df -h ~ 2>/dev/null | tail -1
  echo "== fin"; exit 0 ;;
retour)
  D=$(ls -t "$S"/fichiers-avant-maj-*.tar.gz | head -1); SQL=$(ls -t "$S"/base-avant-maj-*.sql.gz | head -1)
  echo "remise de $D et $SQL"
  cd ~ && mv alchimistes.fr "alchimistes.fr-echec-maj-$(date +%H%M)" && tar xzf "$D" && E=$(ls -td alchimistes.fr-echec-maj-* | head -1) && mv "$E/img/p" alchimistes.fr/img/ && mkdir -p alchimistes.fr/var/cache alchimistes.fr/var/logs && echo "fichiers remis"
  gunzip -c "$SQL" | mysql -h "$H" -P "$P" -u "$U" "$BASE" && echo "base remise"
  echo "== retour fait (la boutique est encore en maintenance : maintenance-fin.sql pour rouvrir)"; exit 0 ;;
go) ;;
*) echo "usage : verifier | go | retour"; exit 1 ;;
esac

[ "$V" = "1.7.6.0" ] || { echo "Version $V : rien à faire."; exit 1; }
[ -n "$ADMIN" ] || { echo "Dossier d'administration introuvable."; exit 1; }
D=$(date +%Y%m%d-%H%M)
echo "1. Sauvegardes"
mysqldump --single-transaction --no-tablespaces -h "$H" -P "$P" -u "$U" "$BASE" | gzip > "$S/base-avant-maj-$D.sql.gz"
gunzip -c "$S/base-avant-maj-$D.sql.gz" | tail -1 | grep -q "Dump completed" || { echo "SAUVEGARDE DE LA BASE INCOMPLÈTE : arrêt."; exit 1; }
cd ~ && tar czf "$S/fichiers-avant-maj-$D.tar.gz" --exclude='alchimistes.fr/var/cache' --exclude='alchimistes.fr/var/logs' --exclude='alchimistes.fr/img/p' alchimistes.fr && gzip -t "$S/fichiers-avant-maj-$D.tar.gz" || { echo "SAUVEGARDE DES FICHIERS INCOMPLÈTE : arrêt."; exit 1; }
ls -lh "$S"/*-avant-maj-$D.*
cd "$B"
echo "2. Maintenance"
php "$M/executer-sql.php" "$M/maintenance-debut.sql"
echo "3. Préparation de l'outil officiel de mise à jour"
cp app/config/parameters.php "$S/parameters-avant-maj-$D.php"
sed -i "s/\.privatesql'/.eu.clouddb.ovh.net'/" app/config/parameters.php
[ -d modules/autoupgrade ] && mv modules/autoupgrade "$S/autoupgrade-ancien-$D"; unzip -qo "$M/autoupgrade-v4.14.4.zip" -d modules/
sed -i -e "s/'PS_AUTOUP_CUSTOM_MOD_DESACT' => 1,/'PS_AUTOUP_CUSTOM_MOD_DESACT' => 0,/" -e "s/'PS_AUTOUP_KEEP_MAILS' => 0,/'PS_AUTOUP_KEEP_MAILS' => 1,/" modules/autoupgrade/classes/Parameters/UpgradeConfigurationStorage.php
sed 's#^\$controller = new \\PrestaShop\\Module\\AutoUpgrade\\TaskRunner\\Upgrade\\AllUpgradeTasks(\$container);#$container->initPrestaShopAutoloader();\n$container->initPrestaShopCore();\n&#' modules/autoupgrade/cli-upgrade.php > modules/autoupgrade/cli-upgrade-alch.php
mkdir -p "$ADMIN/autoupgrade/download" && cp "$M/prestashop_1.7.8.11.zip" "$ADMIN/autoupgrade/download/"
printf '{"channel":"archive","archive_prestashop":"prestashop_1.7.8.11.zip","archive_num":"1.7.8.11","archive_xml":"","skip_backup":"1","PS_AUTOUP_CHANGE_DEFAULT_THEME":"0"}' > "$M/conf.json"
php modules/autoupgrade/cli-updateconfig.php --from="$M/conf.json" --dir="$ADMIN" | tail -2
echo "4. Mise à jour (plusieurs minutes)"
ARGS="modules/autoupgrade/cli-upgrade-alch.php --dir=$ADMIN --channel=archive"
for n in $(seq 1 400); do
  php -d memory_limit=1G -d max_execution_time=0 $ARGS > "$M/etape.log" 2>&1; code=$?
  cat "$M/etape.log" >> "$M/maj-$D.log"
  grep -E "=== Step|ERROR|Fatal" "$M/etape.log" | sort -u | cut -c1-160
  suite=$(grep -o '\$ modules/autoupgrade/cli-upgrade-alch.php .*' "$M/etape.log" | tail -1 | sed 's/^\$ //')
  [ -z "$suite" ] && break
  ARGS="$suite"
done
tail -3 "$M/etape.log"
echo "5. Remise en place"
grep -q "privatesql" "$S/parameters-avant-maj-$D.php" && sed -i "s/\.eu\.clouddb\.ovh\.net'/.privatesql'/" app/config/parameters.php && echo "   nom interne du serveur de base remis : $(grep -c privatesql app/config/parameters.php)"
php -l app/config/parameters.php
for c in var/cache/prod var/cache/dev; do [ -d "$c" ] && mv "$c" "$c-apres-maj-$D"; done
echo "   version : $(grep -o "VERSION = '[0-9.]*'" app/AppKernel.php)"
echo "   base : $(mysql -h "$H" -P "$P" -u "$U" "$BASE" -N -e 'SELECT value FROM ps_configuration WHERE name="PS_VERSION_DB"')"
echo "== fin : la boutique est en MAINTENANCE. Vérifier depuis le bureau, puis rouvrir avec maintenance-fin.sql."
