#!/usr/bin/env bash
#
# Mise à jour du site sur le serveur (OVH Pro / Performance, ou tout hébergement avec accès SSH).
# À lancer depuis le dossier du site, APRÈS avoir envoyé la nouvelle version des fichiers :
#
#     bash deploy.sh
#
# Hébergement mutualisé OVH : plusieurs versions de PHP coexistent, et « php » est parfois une version trop ancienne.
# Indiquer alors la bonne :   PHP=/usr/local/php8.2/bin/php bash deploy.sh
#
# Le script est sans danger si on le relance : il ne touche ni au fichier .env, ni aux données, ni au code d'installation.
set -euo pipefail

cd "$(dirname "$0")"
PHP="${PHP:-php}"

if [ ! -f .env ]; then
    echo "Le fichier .env est absent. Copiez .env.production.example en .env, remplissez-le, puis relancez." >&2
    exit 1
fi

if ! "$PHP" -r 'exit(PHP_VERSION_ID >= 80200 ? 0 : 1);'; then
    echo "PHP 8.2 minimum est requis (version trouvée : $("$PHP" -r 'echo PHP_VERSION;')). Voir « PHP=… bash deploy.sh »." >&2
    exit 1
fi

# Dossiers d'écriture : absents après un envoi de fichiers, car leur contenu n'est jamais envoyé
mkdir -p storage/app/private storage/framework/cache/data storage/framework/sessions storage/framework/views storage/logs bootstrap/cache
chmod -R u+rwX storage bootstrap/cache

# Clé de l'application : créée une seule fois (la changer invaliderait les sessions et les codes de signature en cours)
if ! grep -Eq '^APP_KEY=.+' .env; then
    "$PHP" artisan key:generate --force
fi

# Maintenance pendant la mise à jour : les visiteurs voient une page d'attente
"$PHP" artisan down --retry=30 || true

# En cas d'erreur, on laisse volontairement le site en maintenance : mieux vaut une page d'attente qu'une base à moitié migrée
trap 'echo "ÉCHEC : le site est resté en maintenance. Corrigez l erreur ci-dessus puis relancez bash deploy.sh." >&2' ERR

"$PHP" artisan migrate --force
"$PHP" artisan optimize:clear
"$PHP" artisan config:cache
"$PHP" artisan route:cache
"$PHP" artisan view:cache
"$PHP" artisan event:cache

trap - ERR
"$PHP" artisan up

echo
echo "Mise à jour terminée. Vérifiez l'écran « Paiements » de l'administration."
