#!/usr/bin/env bash
#
# Pre-production deploy of the Symfony 5.4 upgrade.
# (The cloud is currently on Symfony 4 — this performs the SF4 -> 5.4 jump.)
#
# Run this ON THE CLOUD PRE-PROD HOST, from inside the unpacked release dir
# (the directory created by extracting the tarball built with build-package.sh).
#
# Assumptions (adjust if your setup differs):
#   - docker-compose with a "php" service built from the repo Dockerfile (PHP 8.1
#     + intl/gd/imagick/pdo_mysql/apcu/opcache...). The cloud SF4 likely ran PHP 7;
#     this deploy runs the app INSIDE the 8.1 container, so the host PHP is irrelevant.
#   - Secrets/config live in .env.local on the host (NOT shipped in the tarball).
#   - The pre-prod DB holds a COPY OF REAL DATA -> schema changes are gated + a
#     backup is required first.
#
set -euo pipefail

DC="docker-compose"
PHP="$DC exec -T php"

confirm() { read -r -p "$1 [y/N] " _a; [ "${_a:-}" = "y" ] || [ "${_a:-}" = "Y" ]; }
step()    { echo; echo "=========== $* ==========="; }

# ---------------------------------------------------------------------------
step "0. Pre-controlli"
# ---------------------------------------------------------------------------
[ -f composer.json ] || { echo "ERRORE: lancialo dentro la dir del release."; exit 1; }
if [ ! -f .env.local ]; then
    echo "ERRORE: manca .env.local con i segreti di pre-prod"
    echo "  (DATABASE_URL, APP_SECRET, APP_ENV, APP_DEBUG=0, MAILER_DSN, OKTA_*, JWT, ...)."
    echo "  Copialo dal release precedente o crealo, poi ripeti."
    exit 1
fi
echo "APP_ENV/APP_DEBUG attesi in .env.local: APP_ENV=staging (o prod), APP_DEBUG=0"
grep -E '^(APP_ENV|APP_DEBUG)=' .env.local || echo "  -> verifica manualmente APP_ENV/APP_DEBUG"
# config/jwt/*.pem (lexik) sono gitignored: devono esistere sul server
if ! ls config/jwt/*.pem >/dev/null 2>&1; then
    echo "ATTENZIONE: chiavi JWT (config/jwt/*.pem) assenti."
    echo "  Se usi le API JWT, genera con: $PHP php bin/console lexik:jwt:generate-keypair"
fi

# .env "template" non sensibile (i valori reali restano in .env.local che vince)
[ -f .env.staging ] && cp -vf .env.staging .env || true

confirm "Procedo con il deploy?" || { echo "Annullato."; exit 0; }

# ---------------------------------------------------------------------------
step "1. Container (PHP 8.1)"
# ---------------------------------------------------------------------------
$DC build php
$DC up -d
$PHP php -v | head -1   # deve essere PHP 8.1.x

# ---------------------------------------------------------------------------
step "2. Dipendenze PHP (produzione)"
# ---------------------------------------------------------------------------
$PHP composer install --no-dev --optimize-autoloader --no-interaction

# ---------------------------------------------------------------------------
step "3. Cache: rimuovi quella vecchia (SF4) e riscalda (SF5.4, prod)"
# ---------------------------------------------------------------------------
$PHP sh -lc 'rm -rf var/cache/* || true'
$PHP php bin/console cache:clear --no-warmup
$PHP php bin/console cache:warmup

# ---------------------------------------------------------------------------
step "4. Asset dei bundle (scheduler dukecity, ckeditor, ...)"
# ---------------------------------------------------------------------------
# NB: in SF5.4 lo scheduler e' dukecity (non piu' jmose): assets:install ripubblica
#     bundles/dukecitycommandscheduler/ usato dalle pagine scheduler.
# NB: l'editor HTML della pagina "Template email" usa TinyMCE self-hosted, gia'
#     versionato nel repo (public/static/tinymce/) -> nessun comando di install.
#     CKEditor 4 NON e' piu' usato (i release free non sono piu' scaricabili).
$PHP php bin/console assets:install public --symlink --relative

# ---------------------------------------------------------------------------
step "5. Frontend (Webpack Encore)"
# ---------------------------------------------------------------------------
$PHP sh -lc 'npm ci || npm install'
$PHP npm run build

# ---------------------------------------------------------------------------
step "6. DATABASE — backup OBBLIGATORIO (dati reali)"
# ---------------------------------------------------------------------------
echo "Il pre-prod contiene dati reali: fai un backup PRIMA di toccare lo schema."
echo "Esempio (adatta host/porta/credenziali, o estraili da DATABASE_URL):"
echo "    mysqldump -h <host> -P <port> -u <user> -p <db> > backup_db_\$(date +%Y%m%d_%H%M%S).sql"
confirm "Hai gia' eseguito e VERIFICATO un backup del DB?" || { echo "Fermati e fai il backup."; exit 1; }

# ---------------------------------------------------------------------------
step "7. Schema DB — anteprima poi applicazione NON distruttiva"
# ---------------------------------------------------------------------------
echo "--- SQL che verrebbe applicato (anteprima, nessuna modifica): ---"
$PHP php bin/console doctrine:cache:clear-metadata || true
$PHP php bin/console doctrine:schema:update --dump-sql || true
echo "-----------------------------------------------------------------"
echo "NB: si usa --force SENZA --complete -> nessun DROP di colonne/tabelle"
echo "    non mappate (evita perdita dati). Rivedi l'SQL qui sopra."
if confirm "Applicare le modifiche di schema mostrate?"; then
    $PHP php bin/console doctrine:schema:update --force
else
    echo "Schema NON modificato (puoi applicarlo a mano dopo revisione)."
fi

# ---------------------------------------------------------------------------
step "8. Permessi su var/"
# ---------------------------------------------------------------------------
$PHP chown -R www-data:www-data var/ || true
$PHP chmod -R 775 var/ || true

# ---------------------------------------------------------------------------
step "9. Smoke check"
# ---------------------------------------------------------------------------
$PHP php bin/console about | sed -n '1,20p' || true
echo
echo "Verifica manuale: apri la home -> deve reindirizzare a /<locale>/login (302) e mostrare il login (200)."
echo
echo " --> DEPLOY COMPLETATO"
