#!/usr/bin/env bash
# Verpackt unseren Shop (Shopware 6.7.14.1) für den Produktionsverbund.
# Läuft im Entwicklungssystem. Erzeugt:
#   code.tar.gz        Anwendung ohne vendor, var, node_modules, Medien
#   datenbank.sql.gz   Dump von shopware_dev
#   medien/            Liste aller Mediendateien (Upload läuft direkt nach S3)
#   PAKET.md           Inhalt, Zahlen, Prüfsummen
#
# Aufruf: shop-export.sh [zielordner]
set -euo pipefail

SHOP=/var/www/html/ShopwareDev
STAMP="$(date +%Y%m%d-%H%M)"
OUT="${1:-/var/backups/riccardo-shop-umzug-$STAMP}"
DB=shopware_dev

mkdir -p "$OUT"/{code,datenbank,medien}
log() { printf '\n\033[1m== %s\033[0m\n' "$*"; }

log "Fertige Storefront- und Administrations-Dateien prüfen"
missing=0
# In 6.7 liegt die gebaute Administration unter public/bundles/administration,
# ein Ordner public/administration existiert nicht.
for d in "$SHOP/public/bundles/administration" "$SHOP/public/theme"; do
    [ -d "$d" ] || { echo "  fehlt: $d"; missing=1; }
done
if [ "$missing" = 1 ]; then
    echo "  Zuerst bauen: bin/build-storefront.sh und bin/build-administration.sh"
    echo "  (auf den Frontends gibt es kein Node)"
    exit 1
fi
find "$SHOP/custom/plugins" -maxdepth 6 -type d -name dist | wc -l | sed 's/^/  Plugin-dist-Ordner: /'

log "Code verpacken (ohne vendor, var, Medien, node_modules)"
tar czf "$OUT/code/code-$STAMP.tar.gz" -C "$(dirname "$SHOP")" \
    --exclude='ShopwareDev/vendor' \
    --exclude='ShopwareDev/var' \
    --exclude='ShopwareDev/node_modules' \
    --exclude='*/node_modules' \
    --exclude='ShopwareDev/public/media' \
    --exclude='ShopwareDev/public/thumbnail' \
    --exclude='ShopwareDev/public/sitemap' \
    --exclude='ShopwareDev/.git' \
    `# Die Konfiguration des ENTWICKLUNGSSYSTEMS darf niemals mitreisen:` \
    `# .env.local traegt APP_ENV=dev, die Dev-Datenbank, die Dev-Buckets` \
    `# und ein anderes APP_SECRET. Beim ersten Umzug war das Ziel leer und` \
    `# es fiel nicht auf - ueber einen laufenden Shop ausgepackt wuerde es` \
    `# ihn auf die Entwicklungsumgebung umbiegen.` \
    --exclude='ShopwareDev/.env.local' \
    --exclude='ShopwareDev/.env.local.php' \
    --exclude='ShopwareDev/.env.dev' \
    --exclude='ShopwareDev/.env.test' \
    "$(basename "$SHOP")"

log "Datenbank sichern"
mysqldump --single-transaction --quick --routines --triggers --events \
    --default-character-set=utf8mb4 "$DB" | gzip -6 > "$OUT/datenbank/$DB-$STAMP.sql.gz"

log "Medien erfassen"
( cd "$SHOP/public" && find media thumbnail -type f -printf '%s\t%p\n' 2>/dev/null ) > "$OUT/medien/dateien.txt"
awk -F'\t' '{s+=$1} END {printf "  %d Dateien, %.1f GB\n", NR, s/1024/1024/1024}' "$OUT/medien/dateien.txt"

log "Kennzahlen und Prüfsummen"
mysql -N "$DB" -e "
  select concat('Artikel: ', count(*)) from product where parent_id is null
  union all select concat('Varianten: ', count(*)) from product where parent_id is not null
  union all select concat('Kategorien: ', count(*)) from category
  union all select concat('Medien: ', count(*)) from media
  union all select concat('CMS-Seiten: ', count(*)) from cms_page
  union all select concat('Bestellungen: ', count(*)) from \`order\`
  union all select concat('Kunden: ', count(*)) from customer
  union all select concat('Verkaufskanäle: ', count(*)) from sales_channel
  union all select concat('Eigene Plugins: ', count(*)) from plugin where author = 'Riccardo'
" > "$OUT/kennzahlen.txt" 2>/dev/null || true
mysql -N "$DB" -e "select concat(sc.name, ' -> ', d.url) from sales_channel_domain d
  join sales_channel_translation sc on sc.sales_channel_id = d.sales_channel_id" > "$OUT/verkaufskanal-domains.txt" 2>/dev/null || true
( cd "$OUT" && find code datenbank -type f -exec sha256sum {} \; > pruefsummen.sha256 )

cat > "$OUT/PAKET.md" <<EOF
# Umzugspaket Riccardo-Shop (Shopware 6.7.14.1)

Erstellt am $(date '+%d.%m.%Y %H:%M') aus $SHOP.

| Teil | Größe |
| --- | --- |
| code/code-$STAMP.tar.gz | $(du -h "$OUT/code/code-$STAMP.tar.gz" | cut -f1) |
| datenbank/$DB-$STAMP.sql.gz | $(du -h "$OUT/datenbank/$DB-$STAMP.sql.gz" | cut -f1) |
| medien/dateien.txt | $(du -h "$OUT/medien/dateien.txt" | cut -f1) |

## Kennzahlen

\`\`\`
$(cat "$OUT/kennzahlen.txt" 2>/dev/null)
\`\`\`

## Verkaufskanal-Domains im Dump (müssen beim Import umgeschrieben werden)

\`\`\`
$(cat "$OUT/verkaufskanal-domains.txt" 2>/dev/null)
\`\`\`

Medien sind NICHT im Paket: sie gehen mit \`medien-hochladen.sh\` direkt in den
Object Storage. Weiter mit UMZUG.md.
EOF

log "Fertig: $OUT"
du -sh "$OUT"/* | sort -h
