#!/usr/bin/env bash
#
# Déploiement — Lambec Trans Express
#
# À coller dans Plesk : Git → Paramètres du dépôt →
# « Actions de déploiement supplémentaires » :
#
#     bash deploy.sh
#
# Le script est idempotent : le relancer ne casse rien. Il n'écrase jamais la
# base de données ni les fichiers envoyés depuis l'administration.
#
# IMPORTANT — ce fichier n'utilise QUE des primitives de bash : pas de
# dirname, date, mkdir, grep ni tail. Les shells restreints de Plesk (accès
# SSH « chrooted ») n'exposent pas les utilitaires système habituels, et le
# script échouait dès sa première ligne sur « dirname: command not found ».
# Tout le travail réel est fait par bin/deploy.php : PHP, lui, est forcément
# présent puisque l'application en dépend.

set -euo pipefail

# Équivalent builtin de « cd "$(dirname "$0")" »
case "$0" in
    */*) cd "${0%/*}" ;;
    *)   ;;                 # déjà dans le bon dossier
esac

printf '\n  Déploiement — Lambec Trans Express\n'
printf '  ─────────────────────────────────────────────────────\n'

# ---------------------------------------------------------------------
#  Trouver l'interpréteur PHP
#
#  « command -v » et « [ -x ] » sont des primitives de bash : cette
#  recherche fonctionne même dans un shell dépourvu de tout utilitaire.
# ---------------------------------------------------------------------
PHP=""

essayer() {
    [ -n "$PHP" ] && return 0
    [ -x "$1" ] || return 1
    # On refuse tout PHP antérieur à 8.1, y compris un vieux php en PATH.
    "$1" -r 'exit(PHP_VERSION_ID >= 80100 ? 0 : 1);' 2>/dev/null || return 1
    PHP="$1"
}

if [ -n "${PHP_BIN:-}" ]; then
    # Surcharge manuelle : PHP_BIN=/chemin/vers/php bash deploy.sh
    essayer "$PHP_BIN" || {
        printf '  ✗ PHP_BIN=%s ne pointe pas sur un PHP 8.1+ exécutable.\n\n' "$PHP_BIN"
        exit 1
    }
else
    # Plesk range ses PHP hors du PATH. Le glob les trie par ordre croissant
    # (8.1, 8.2, 8.3…) ; on parcourt donc à l'envers pour prendre le plus récent.
    candidats=()
    for chemin in /opt/plesk/php/*/bin/php /opt/alt/php*/usr/bin/php \
                  /usr/local/psa/bin/php /usr/bin/php* /usr/local/bin/php* \
                  /bin/php* /opt/php*/bin/php; do
        [ -x "$chemin" ] && candidats+=("$chemin")
    done

    # Tout ce qui ressemble à un php dans les dossiers du PATH. Indispensable
    # dans une cage chroot, où l'arborescence n'a rien de standard.
    for dossier in ${PATH//:/ }; do
        for chemin in "$dossier"/php "$dossier"/php[0-9]*; do
            [ -x "$chemin" ] && candidats+=("$chemin")
        done
    done

    for (( i=${#candidats[@]}-1 ; i>=0 ; i-- )); do
        essayer "${candidats[i]}" && break
    done
fi

if [ -z "$PHP" ]; then
    printf '  ✗ Aucun PHP 8.1 ou supérieur accessible.\n\n'

    # Distinguer une cage chroot d'un simple PHP mal placé : le remède n'a
    # rien à voir. Deux signaux fiables, car /etc et /usr existent aussi
    # dans la cage et ne prouvent donc rien :
    #   - /httpdocs à la racine : le dossier du site EST devenu « / » ;
    #   - /opt absent : Plesk y range ses PHP, il est hors de la cage.
    encage=0
    [ -d /httpdocs ] && encage=1
    [ -d /opt ]      || encage=1

    if [ "$encage" = 1 ]; then
        printf '    Votre shell est enfermé dans une cage (SSH chrooté) : les\n'
        printf '    dossiers système n'"'"'y sont pas visibles, PHP non plus. Ce n'"'"'est\n'
        printf '    pas que PHP manque sur le serveur — vous ne pouvez pas l'"'"'atteindre\n'
        printf '    depuis ici.\n\n'
        printf '    Trois solutions, de la plus simple à la plus technique :\n\n'
        printf '    1. Lancez le déploiement depuis Plesk plutôt que depuis ce shell.\n'
        printf '       Plesk → Sites Web & Domaines → Git → Déployer.\n'
        printf '       Les actions de déploiement ne s'"'"'exécutent pas toujours dans\n'
        printf '       la même cage que le SSH interactif.\n\n'
        printf '    2. Sortez le SSH de sa cage :\n'
        printf '       Plesk → Abonnements → votre domaine → Accès à l'"'"'hébergement\n'
        printf '       → Accès au serveur par SSH : /bin/bash  (au lieu de « chrooted »)\n\n'
        printf '    3. Sans SSH du tout : Plesk → Outils & Paramètres → Tâches\n'
        printf '       planifiées → Exécuter une commande, avec le chemin complet\n'
        printf '       vers PHP. Les tâches planifiées, elles, ne sont pas encagées.\n\n'
    else
        printf '    Emplacements examinés :\n'
        for chemin in /opt/plesk/php/*/bin/php /opt/alt/php*/usr/bin/php \
                      /usr/local/psa/bin/php /usr/bin/php* /usr/local/bin/php*; do
            if [ -x "$chemin" ]; then
                printf '      %s  (présent, version trop ancienne)\n' "$chemin"
            elif [ -e "$chemin" ]; then
                printf '      %s  (présent, non exécutable)\n' "$chemin"
            fi
        done
        printf '\n    Pour localiser votre PHP :\n'
        printf '      for p in /opt/plesk/php/*/bin/php /usr/bin/php*; do [ -x "$p" ] && echo "$p"; done\n'
        printf '\n    Puis relancez en l'"'"'indiquant :\n'
        printf '      PHP_BIN=/opt/plesk/php/8.3/bin/php bash deploy.sh\n\n'
    fi

    exit 1
fi

# ---------------------------------------------------------------------
#  Préparation : extensions, dossiers, mode débogage, sauvegarde
# ---------------------------------------------------------------------
"$PHP" bin/deploy.php

# ---------------------------------------------------------------------
#  Structure de la base et migrations en attente
# ---------------------------------------------------------------------
"$PHP" bin/install.php

# ---------------------------------------------------------------------
#  Contrôle de non-régression
# ---------------------------------------------------------------------
printf '  Vérification de l'"'"'application\n'
printf '  ─────────────────────────────────────────────────────\n'

if ! "$PHP" bin/check.php; then
    printf '\n  Le code est déployé mais des vérifications ont échoué.\n'
    printf '  Une sauvegarde de la base est disponible dans storage/backups/.\n\n'
    exit 1
fi

# ---------------------------------------------------------------------
#  Rappel de l'étape que Plesk ne fait pas tout seul
# ---------------------------------------------------------------------
printf '  ─────────────────────────────────────────────────────\n'
printf '  Déploiement terminé.\n\n'
printf '  Vérifiez une fois pour toutes que la racine du document pointe\n'
printf '  sur le sous-dossier public/ :\n'
printf '    Plesk → Sites Web & Domaines → Paramètres d'"'"'hébergement\n'
printf '    → Racine du document : httpdocs/public\n\n'
