#!/bin/bash
set -e

# --uri esplicito: drush invocato senza terminale interattivo (es. via shell_exec
# da PHP-FPM, come fa /admin/crmp/git-management) non riesce sempre a dedurre
# l'host corrente e cade su un default che DrupalKernel rifiuta se e' configurato
# trusted_host_patterns ("The provided host name is not valid for this server").
# $1, se passato, e' l'URI del sito corrente (schema+host); altrimenti drush
# prova comunque a dedurlo da solo (comportamento invariato per l'uso da SSH).
URI_ARG=()
if [ -n "$1" ]; then
    URI_ARG=(--uri="$1")
fi

drush "${URI_ARG[@]}" maint:set 1

chmod +w web/sites/default/
chmod u+w web/sites/default/ web/sites/default/settings.php web/sites/default/*.yml

# Se uno step successivo fallisce (es. composer update va in errore per un
# patches.lock.json corrotto/disallineato), riporta comunque il sito in uno
# stato consistente invece di lasciarlo in manutenzione con settings.php
# scrivibile fino a un intervento manuale via SSH.
# "chmod -w" qui e' best-effort: web/sites/default/ ha una ACL con group/other
# rwx (per la condivisione tra utenti unix di prod e staging), quindi chmod non
# riesce mai a rimuovere davvero i bit di scrittura e ritorna exit 1 - non deve
# pero' interrompere il cleanup ne', sotto "set -e", l'intero script.
trap 'chmod -w web/sites/default/ || true; drush "${URI_ARG[@]}" maint:set 0' EXIT

# TMPDIR dedicata per utente: /tmp e' condiviso tra gli utenti unix di prod
# (crmprestito) e staging (dmstaging) sullo stesso host. cweagans/composer-patches
# scarica le patch in $TMPDIR/composer-patches/, quindi senza isolare la dir per
# utente il primo che la crea blocca in scrittura l'altro (permission denied) e
# l'operazione si interrompe a meta', lasciando pacchetti patchati disinstallati
# e reinstallati senza patch applicata.
# NB: qui NON si usa --ignore-platform-reqs, a differenza di
# update_drupal_core_local. Su staging/prod ext-imap/ext-mailparse/ext-soap
# sono realmente installate, quindi sia "composer update" sia il reinstall
# interno di "composer patches-repatch" (vedi sotto) trovano la piattaforma
# compatibile senza bisogno del flag ne' di un fallback manuale.
TMPDIR_PATCHES=/tmp/composer-patches-$(whoami)
mkdir -p "$TMPDIR_PATCHES"
TMPDIR="$TMPDIR_PATCHES" composer update -W

# "composer update" applica le patch solo ai pacchetti che (re)installa in
# questa run: se un pacchetto patchato e' gia' alla versione richiesta,
# l'evento di patch non scatta neppure con un lock fresco. "patches-repatch"
# forza la disinstallazione/reinstallazione dei soli pacchetti con patch,
# garantendo che siano sempre applicate.
TMPDIR="$TMPDIR_PATCHES" composer patches-repatch

chmod -w web/sites/default/ || true
drush "${URI_ARG[@]}" updatedb -y

drush "${URI_ARG[@]}" maint:set 0
drush "${URI_ARG[@]}" cr

drush "${URI_ARG[@]}" cron

rm -rf "$TMPDIR_PATCHES"
