#!/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"

SCHEMA_DB=${SCHEMA_DB:-gibertini_backup}
echo "== 2. Struttura finale (da $SCHEMA_DB, senza dati)"
# schema.sql non è più lo schema di partenza degli import 01..10 (lo si è
# aggiornato per strada e git non ha l'originale): si parte dalla struttura di
# oggi, che è quella dopo la 125, e le migration rilanciate dopo falliscono
# innocue sulle parti di struttura ("colonna già presente") ed eseguono i dati.
TABELLE=($(mariadb $C -N -e "SELECT table_name FROM information_schema.tables WHERE table_schema='$SCHEMA_DB' AND table_type='BASE TABLE' AND table_name NOT LIKE '%\\_bk%' AND table_name<>'products_name_backup'" 2>/dev/null))
mariadb-dump $C --no-data --skip-add-drop-table --skip-triggers $SCHEMA_DB $TABELLE 2>/dev/null \
    | perl -pe 's/ AUTO_INCREMENT=\d+//' > $LOG/struttura.sql
esegui $LOG/struttura.sql
echo "  ${#TABELLE} tabelle"
# La 06 riempie inventory_stock tramite questo trigger (lo toglie la 072):
# lo si rimette per il tempo dell'import, come allora.
cat > $LOG/trigger-06.sql <<'EOF'
DELIMITER //
CREATE TRIGGER trg_inventory_after_insert AFTER INSERT ON inventory_movements FOR EACH ROW
BEGIN
    INSERT INTO inventory_stock (product_id, quantity_available) VALUES (NEW.product_id, NEW.quantity)
    ON DUPLICATE KEY UPDATE quantity_available = quantity_available + NEW.quantity;
END//
DELIMITER ;
EOF
esegui $LOG/trigger-06.sql

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"
