#!/bin/zsh
# Costruisce da zero il database finale del gestionale a partire dal dump di
# PrestaShop, ripetendo nell'ordine tutto quello che si è fatto in questi mesi:
#   schema.sql + seed -> import PrestaShop 01..10 -> migration 011..125
#   (con la migrazione categorie 106 al suo posto) -> configurazione da TopHost.
#
# Uso (dal Mac, devuser ha tutti i permessi su gibertini_%):
#   MYSQL_PWD=... scripts/costruisci-db-finale.sh <db_prestashop> <db_destinazione> <db_tophost>
#   es. scripts/costruisci-db-finale.sh gibertini_dump1 gibertini_prova gibertini_tophost
#
# Il database di destinazione viene CANCELLATO e ricreato. Rifiuta di toccare
# gibertini_gestionale se non con FORZA_GESTIONALE=1.
# Il log di ogni passo finisce in scripts/log-db-finale/<destinazione>/.

set -u
PS_DB=${1:?db PrestaShop}; DEST=${2:?db destinazione}; TH_DB=${3:?db TopHost}
HOST=${DB_HOST:-192.168.1.2}; PORT=${DB_PORT:-3307}; USER_DB=${DB_USER:-devuser}
: ${MYSQL_PWD:?serve MYSQL_PWD}
export MYSQL_PWD
if [[ $DEST == gibertini_gestionale && ${FORZA_GESTIONALE:-0} != 1 ]]; then
    echo "Destinazione gibertini_gestionale: serve FORZA_GESTIONALE=1"; exit 1
fi

ROOT=${0:A:h:h}
MIG=$ROOT/database/migrations
LOG=$ROOT/scripts/log-db-finale/$DEST
rm -rf $LOG; mkdir -p $LOG
C=(-h $HOST -P $PORT -u $USER_DB --default-character-set=utf8mb4)
sql() { mariadb $C "$@" 2>&1 | grep -v 'ssl-verify-server-cert'; }

# Ogni file passa da qui: nomi dei database sostituiti, errori nel log.
# --force: un errore non ferma il file (alcune migration storiche, es. 025,
# si fermavano su colonne già presenti e la successiva completava il lavoro).
esegui() {
    local f=$1 nome=${1:t}
    DEST=$DEST PS_DB=$PS_DB perl -pe 's/\bgibertini_gestionale\b/$ENV{DEST}/g; s/\bgibertini\./$ENV{PS_DB}./g' $f \
        | mariadb $C --force $DEST > $LOG/$nome.log 2>&1
    grep -v 'ssl-verify-server-cert' $LOG/$nome.log > $LOG/$nome.tmp; mv $LOG/$nome.tmp $LOG/$nome.log
    if [[ -s $LOG/$nome.log ]]; then echo "  ! $nome: $(grep -c ERROR $LOG/$nome.log) errori (vedi log)"; else echo "  ok $nome"; rm $LOG/$nome.log; fi
}

echo "== 1. Database $DEST da zero"
sql -e "DROP DATABASE IF EXISTS \`$DEST\`; CREATE DATABASE \`$DEST\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"

echo "== 2. Schema e seed"
esegui $ROOT/database/schema.sql
for s in seed_settings seed_admin seed_payment_methods seed_shipping_zones seed_pages seed_user_groups; do
    esegui $ROOT/database/seeds/$s.sql
done

echo "== 3. Import PrestaShop ($PS_DB)"
for n in 01 02 03 04 05 06 07 08 09 10; do esegui $MIG/${n}_*.sql; done

echo "== 4. Migration 011..125"
# Saltate: le varianti solo-TopHost (…b) e la 042, preparatoria mai eseguita.
for f in $(command ls $MIG | grep -E '^[0-9]{3}[a-z]?_.*\.(sql|php)$' | sort); do
    case $f in
        033b_*|035b_*|083b_*|086b_*|042_*) continue ;;
        106_migrazione_categorie_prodotti.php)
            echo "  -- 106 migrazione categorie"
            export MIG_DB_HOST=$HOST MIG_DB_PORT=$PORT MIG_DB_USER=$USER_DB MIG_DB_PASS=$MYSQL_PWD MIG_DB_NAME=$DEST
            php $MIG/$f --execute > $LOG/106-execute.log 2>&1 && echo "  ok 106 --execute" || echo "  ! 106 --execute fallito"
            php $MIG/$f --filters --execute > $LOG/106-filters.log 2>&1 && echo "  ok 106 --filters" || echo "  ! 106 --filters fallito"
            continue ;;
        *.php) continue ;;
    esac
    esegui $MIG/$f
done

echo "== fatto. Log in $LOG"
