#!/usr/bin/env bash
#
# Déploiement sur PlanetHoster (N0C).
#
# À exécuter en SSH depuis la racine de l'application :
#     cd ~/portraits && ./deploy.sh
#
# Le script s'arrête à la première erreur : mieux vaut une application en
# maintenance qu'une application à moitié déployée.

set -euo pipefail

# --- Réglages ---------------------------------------------------------------
# Chemin du binaire PHP versionné. `php` tout court pointe vers la version
# native du compte, qui n'est pas forcément celle attendue.
PHP="${PHP_BIN:-/opt/alt/php83/usr/bin/php}"
COMPOSER="${COMPOSER_BIN:-$HOME/.local/bin/composer}"
BRANCH="${DEPLOY_BRANCH:-main}"

step() { printf '\n\033[1m▸ %s\033[0m\n' "$1"; }

# --- Contrôles préalables ---------------------------------------------------
[ -f artisan ] || { echo "artisan introuvable : lancez le script depuis la racine de l'application."; exit 1; }
[ -x "$PHP" ]  || { echo "PHP introuvable : $PHP — ajustez PHP_BIN."; exit 1; }

step "PHP utilisé"
"$PHP" -v | head -1

# --- Mise en maintenance ----------------------------------------------------
# `--render` sert une vraie page plutôt qu'un 503 brut. Le secret permet de
# continuer à naviguer sur le site pendant l'opération.
step "Passage en maintenance"
"$PHP" artisan down --render="errors::503" --retry=60 --secret="${MAINTENANCE_SECRET:-deploiement}" || true

restore() {
    step "Sortie de maintenance"
    "$PHP" artisan up || true
}
trap restore EXIT

# --- Code -------------------------------------------------------------------
if [ -d .git ]; then
    step "Récupération du code ($BRANCH)"
    git fetch --all --prune
    git reset --hard "origin/$BRANCH"
fi

# --- Dépendances ------------------------------------------------------------
step "Dépendances PHP"
# --no-dev : ni Pest ni les outils de développement en production.
# -d memory_limit=-1 : la résolution de dépendances dépasse souvent 128 Mo.
"$PHP" -d memory_limit=-1 "$COMPOSER" install \
    --no-dev --prefer-dist --no-interaction --optimize-autoloader

# --- Assets -----------------------------------------------------------------
# Par défaut, les assets sont compilés sur le poste de développement et
# versionnés dans public/build : cela évite d'installer node_modules sur
# l'hébergement, où les inodes sont comptés.
if [ "${BUILD_ASSETS:-0}" = "1" ]; then
    step "Compilation des assets"
    npm ci --omit=dev
    npm run build
fi

[ -f public/build/manifest.json ] || {
    echo "public/build/manifest.json absent : compilez les assets avant de déployer (npm run build)."
    exit 1
}

# --- Base de données --------------------------------------------------------
step "Migrations"
"$PHP" artisan migrate --force --no-interaction

# --- Optimisations ----------------------------------------------------------
step "Mise en cache de la configuration"
"$PHP" artisan optimize:clear
"$PHP" artisan config:cache
"$PHP" artisan route:cache
"$PHP" artisan view:cache
"$PHP" artisan event:cache

# --- Contrôle final ---------------------------------------------------------
step "Diagnostic serveur"
"$PHP" artisan app:doctor

step "Déploiement terminé"
