#!/usr/bin/env bash
#
# Mise à jour d'École Haïti sur le VPS : nouvelle release à côté de l'ancienne,
# bascule du lien `current` (quelques millisecondes de coupure), retour
# arrière automatique si les migrations échouent.
#
# Usage (root) :  bash deploy.sh /root/ecole-haiti-<version>.zip
#                 bash deploy.sh --rollback     # revient à la release précédente
set -euo pipefail

APP_ROOT=/var/www/ecole-haiti
step() { printf '\n\033[36m[%s] %s\033[0m\n' "$1" "$2"; }
artisan() { sudo -u www-data php "$APP_ROOT/current/artisan" "$@"; }

[[ $EUID -eq 0 ]] || { echo "À lancer en root (sudo)." >&2; exit 1; }
[[ -f "$APP_ROOT/shared/.env" ]] || { echo "Aucune installation dans $APP_ROOT : utilisez install.sh." >&2; exit 1; }

current_release() { basename "$(readlink -f "$APP_ROOT/current")"; }

if [[ "${1:-}" == "--rollback" ]]; then
    PREV="$(ls -1 "$APP_ROOT/releases" | grep -v "^$(current_release)$" | sort | tail -n 1 || true)"
    [[ -n "$PREV" ]] || { echo "Aucune release précédente." >&2; exit 1; }
    step R "Retour à la release $PREV"
    ln -sfn "$APP_ROOT/releases/$PREV" "$APP_ROOT/current"
    artisan config:cache >/dev/null; artisan route:cache >/dev/null; artisan view:cache >/dev/null
    systemctl reload php8.3-fpm
    echo "Attention : les migrations de la release abandonnée ne sont PAS annulées ; restaurez une sauvegarde si besoin."
    exit 0
fi

ZIP="${1:?Usage: deploy.sh <archive.zip> | --rollback}"
[[ -f "$ZIP" ]] || { echo "Archive introuvable : $ZIP" >&2; exit 1; }

VERSION="$(unzip -p "$ZIP" VERSION 2>/dev/null | tr -d '[:space:]' || date +%Y.%m.%d-%H%M)"
RELEASE="$APP_ROOT/releases/$VERSION"
OLD="$(current_release)"
echo "Release installée : $OLD  →  nouvelle : $VERSION"

step 1 "Sauvegarde de la base"
/usr/local/bin/ecole-haiti-backup

step 2 "Extraction dans $RELEASE"
rm -rf "$RELEASE"; mkdir -p "$RELEASE"
unzip -q "$ZIP" -d "$RELEASE"
rm -rf "$RELEASE/storage"
ln -s "$APP_ROOT/shared/storage" "$RELEASE/storage"
ln -s "$APP_ROOT/shared/.env" "$RELEASE/.env"
chown -R www-data:www-data "$RELEASE"
chmod -R u+rwX,g+rwX "$RELEASE/bootstrap/cache"

step 3 "Migrations (mode maintenance)"
artisan down --retry=30 >/dev/null || true
if sudo -u www-data php "$RELEASE/artisan" migrate --force --no-interaction; then
    step 4 "Bascule vers $VERSION"
    ln -sfn "$RELEASE" "$APP_ROOT/current"
    artisan storage:link --force >/dev/null
    artisan config:cache >/dev/null; artisan route:cache >/dev/null; artisan view:cache >/dev/null
    systemctl reload php8.3-fpm
    artisan up >/dev/null
else
    echo "Migrations en échec : la release $OLD reste active." >&2
    artisan up >/dev/null || true
    rm -rf "$RELEASE"
    exit 1
fi

# On garde les 3 dernières releases pour un retour arrière rapide.
ls -1dt "$APP_ROOT"/releases/* | tail -n +4 | xargs -r rm -rf

echo
echo "Mise à jour terminée : $OLD → $VERSION"
