#!/usr/bin/env bash
#
# Construit l'archive de livraison (v1.4 §11).
#
# ⚠️ LES FICHIERS SONT À PLAT À LA RACINE DE L'ARCHIVE (app/, bootstrap/, config/… au premier
# niveau). Le zip de la v1.3 s'extrayait dans un sous-dossier `irada-app-v1.3.0/`, ce qui a fait
# échouer le déploiement EN SILENCE : le serveur continuait de servir l'ancienne version et
# personne ne pouvait le constater depuis le navigateur.
#
# Le script écrit aussi `public/version.json` (tag + date + commit), lu par le pied de page des
# trois panneaux et par l'écran d'administration système : après un déploiement, un coup d'œil
# suffit désormais à savoir ce qui tourne réellement.
#
# Usage : bash scripts/construire-archive.sh v1.4.0
set -euo pipefail

TAG="${1:-$(git describe --tags --abbrev=0 2>/dev/null || echo dev)}"
RACINE="$(cd "$(dirname "$0")/.." && pwd)"
SORTIE="${HOME}/Desktop/irada-app-${TAG}.zip"

cd "$RACINE"

echo "==> Marqueur de version"
COMMIT="$(git rev-parse HEAD 2>/dev/null || echo inconnu)"
DATE="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
cat > public/version.json <<JSON
{
    "tag": "${TAG}",
    "built_at": "${DATE}",
    "commit": "${COMMIT}"
}
JSON
echo "    ${TAG} — ${DATE} — ${COMMIT:0:7}"

echo "==> Assets compilés"
[ -d public/build ] || { echo "ERREUR : public/build absent — lancer npm run build." >&2; exit 1; }
bash scripts/controle-dark-css.sh >/dev/null

# Les fichiers .env.* servent aux revues locales (bases de test, mots de passe jetables) : ils
# ne doivent JAMAIS voyager dans une archive de production. Seul .env.example part.
echo "==> Copie de travail (le dépôt local n'est jamais modifié)"
TEMP="$(mktemp -d)"
trap 'rm -rf "$TEMP"' EXIT
COPIE="$TEMP/app"

rsync -a \
    --exclude '.git' \
    --exclude 'node_modules' \
    --exclude 'tests' \
    --exclude '.phpunit.result.cache' \
    --include '.env.example' \
    --exclude '.env' \
    --exclude '.env.*' \
    --exclude '.DS_Store' \
    --exclude 'storage/logs/*' \
    --exclude 'storage/framework/cache/data/*' \
    --exclude 'storage/framework/sessions/*' \
    --exclude 'storage/framework/views/*' \
    --exclude 'storage/framework/testing' \
    --exclude 'storage/app/private/*' \
    --exclude 'storage/app/public/*' \
    --exclude 'database/database.sqlite' \
    --exclude '* 2' \
    --exclude '* 2.*' \
    ./ "$COPIE/"

echo "==> Dépendances de PRODUCTION uniquement"
# Le serveur n'a pas Composer : le vendor voyage dans l'archive. On en retire les paquets de
# développement (Pint, Pest, Faker…) — 20 Mo inutiles et du code qui n'a rien à faire en
# production. La copie de travail est jetée ensuite : l'environnement local reste intact.
(cd "$COPIE" && composer install --no-dev --optimize-autoloader --no-interaction --quiet)

echo "==> Archive"
rm -f "$SORTIE"

# Les chemins sont relatifs à la racine de la copie : l'archive est donc À PLAT.
(cd "$COPIE" && zip -r -q "$SORTIE" . -x '*.DS_Store')

echo "==> Vérification : les fichiers doivent être À PLAT"
PREMIER="$(unzip -l "$SORTIE" | awk 'NR>3 {print $4}' | grep -v '^$' | head -20)"
echo "$PREMIER" | sed 's/^/    /'

if echo "$PREMIER" | grep -qE '^irada-app'; then
    echo "ÉCHEC : l'archive contient un dossier racine — le déploiement échouerait en silence." >&2
    exit 1
fi

echo
echo "Archive : $SORTIE"
du -h "$SORTIE" | awk '{print "Taille  : "$1}'
