#!/usr/bin/env bash
# ════════════════════════════════════════════════════════════════════════════
# Yerba Buena PRODUCCIÓN — Sync seguro código + productos TN
# ════════════════════════════════════════════════════════════════════════════
#
# Qué hace:
#   1. Backup completo de DB (red de seguridad)
#   2. Diagnóstico de qué tiene producción modificado vs origin/cd-system
#   3. Stash defensivo de cambios locales (NO los pierde, los guarda etiquetados)
#   4. Pull limpio desde origin/cd-system
#   5. composer install + php artisan migrate (si hay migrations nuevas)
#   6. Flush caches Laravel + restart PHP-FPM (invalida opcache)
#   7. Verifica .env TN configurado, si no avisa y aborta sync
#   8. Sync productos TN: dry-run primero, esperar OK, luego real
#   9. Smoke test HTTP de rutas críticas
#
# Cómo correr:
#   scp -o ConnectTimeout=10 yerbabuena-prod-sync.sh vps2:/tmp/
#   ssh vps2 "sudo -u supledev bash /tmp/yerbabuena-prod-sync.sh"
#
# Pre-requisito en producción (UNA sola vez):
#   En el .env del tenant tienen que estar TIENDANUBE_STORE_ID,
#   TIENDANUBE_ACCESS_TOKEN, TIENDANUBE_USER_AGENT. Sino el sync se aborta.
#
# El script NUNCA:
#   - Borra DB
#   - Hace git reset --hard
#   - Borra archivos del repo
#   - Modifica .env existente
#
# Si algo falla en pasos 4-9, podés volver atrás con:
#   git stash list                              # ver stashes etiquetados
#   git stash pop stash@{0}                     # restaurar cambios pre-sync
#   mysql {db} < /tmp/yb-db-backup-{TS}.sql     # restaurar DB
# ════════════════════════════════════════════════════════════════════════════

set -e

TENANT_DIR="/home/supledev/web/suplementosyerbabuena.com/public_html/git-files/supledev"
DOMAIN="https://suplementosyerbabuena.com"
DB_NAME=""  # se autodetecta del .env
TS=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR="/home/supledev/backups"
DRY_RUN_TN_AT_END=true   # ponelo en false para que corra el sync TN real al final

echo "═══════════════════════════════════════════════════════════════════"
echo "🚀 Yerba Buena PRODUCCIÓN — Sync $(date '+%Y-%m-%d %H:%M:%S')"
echo "═══════════════════════════════════════════════════════════════════"

# ── 0. Pre-flight checks ────────────────────────────────────────────────
echo
echo "─── 0. Pre-flight checks ───────────────────────────────────────"
cd "$TENANT_DIR" || { echo "❌ TENANT_DIR no existe: $TENANT_DIR"; exit 1; }
echo "  ✓ working dir: $(pwd)"
echo "  ✓ git branch: $(git branch --show-current)"
echo "  ✓ último commit local: $(git log --oneline -1)"

# Detectar DB del .env
DB_NAME=$(grep '^DB_DATABASE=' .env 2>/dev/null | cut -d= -f2 | tr -d '"' | tr -d "'")
if [ -z "$DB_NAME" ]; then
    echo "  ❌ No pude detectar DB_DATABASE del .env"
    exit 1
fi
echo "  ✓ DB detectada: $DB_NAME"

# Detectar credenciales TN del .env (si están)
TN_STORE_ID=$(grep '^TIENDANUBE_STORE_ID=' .env 2>/dev/null | cut -d= -f2 | tr -d '"')
TN_TOKEN_SET="no"
if grep -q '^TIENDANUBE_ACCESS_TOKEN=.\+' .env 2>/dev/null; then
    TN_TOKEN_SET="sí"
fi
echo "  ✓ TN store_id: ${TN_STORE_ID:-'(no seteado)'}"
echo "  ✓ TN token presente: $TN_TOKEN_SET"

mkdir -p "$BACKUP_DIR"

# ── 1. Backup DB completo ───────────────────────────────────────────────
echo
echo "─── 1. Backup DB (red de seguridad) ────────────────────────────"
BACKUP_FILE="${BACKUP_DIR}/yb-db-${TS}.sql"
mysqldump --single-transaction --quick --routines --triggers \
    "$DB_NAME" > "$BACKUP_FILE" 2>/dev/null || {
    echo "  ⚠️  mysqldump sin --triggers (probable falta de SUPER privilege)"
    mysqldump --single-transaction --quick "$DB_NAME" > "$BACKUP_FILE"
}
gzip "$BACKUP_FILE"
echo "  ✓ backup: ${BACKUP_FILE}.gz ($(du -h "${BACKUP_FILE}.gz" | cut -f1))"

# Listar últimos 3 backups para no acumular para siempre
echo "  → backups recientes:"
ls -1t "$BACKUP_DIR"/yb-db-*.sql.gz 2>/dev/null | head -3 | sed 's/^/    /'

# ── 2. Diagnóstico estado git ────────────────────────────────────────────
echo
echo "─── 2. Diagnóstico estado git ──────────────────────────────────"
git fetch origin --quiet
LOCAL=$(git rev-parse HEAD)
REMOTE=$(git rev-parse origin/cd-system)
BEHIND=$(git rev-list --count HEAD..origin/cd-system)
AHEAD=$(git rev-list --count origin/cd-system..HEAD)
echo "  local:  $LOCAL"
echo "  remote: $REMOTE"
echo "  behind: $BEHIND commits | ahead: $AHEAD commits"

if [ "$LOCAL" = "$REMOTE" ]; then
    echo "  ✓ ya estamos al día — no hay nada para pullear"
    SKIP_PULL=true
else
    SKIP_PULL=false
fi

echo
echo "  Archivos modificados localmente (vs remote):"
MODIFIED=$(git status --porcelain | grep -v '^??' || true)
if [ -z "$MODIFIED" ]; then
    echo "    (ninguno — working tree limpio)"
    HAS_LOCAL_CHANGES=false
else
    echo "$MODIFIED" | head -20 | sed 's/^/    /'
    [ "$(echo "$MODIFIED" | wc -l)" -gt 20 ] && echo "    ... y más"
    HAS_LOCAL_CHANGES=true
fi

echo
echo "  Archivos untracked (no en git, no se pierden con stash --include-untracked):"
UNTRACKED=$(git status --porcelain | grep '^??' || true)
if [ -z "$UNTRACKED" ]; then
    echo "    (ninguno)"
else
    echo "$UNTRACKED" | head -10 | sed 's/^/    /'
    [ "$(echo "$UNTRACKED" | wc -l)" -gt 10 ] && echo "    ... y más"
fi

# ── 3. Stash defensivo ──────────────────────────────────────────────────
echo
echo "─── 3. Stash defensivo (NO se pierde, queda etiquetado) ────────"
if [ "$HAS_LOCAL_CHANGES" = "true" ]; then
    STASH_MSG="prod-sync-${TS}"
    git stash push -m "$STASH_MSG" --include-untracked
    echo "  ✓ stash creado: '$STASH_MSG'"
    echo "  → para verlo después: git stash show -p stash@{0}"
    echo "  → para recuperarlo:   git stash pop stash@{0}"
else
    echo "  ✓ nada para stashear"
fi

# ── 4. Pull ─────────────────────────────────────────────────────────────
echo
echo "─── 4. Pull origin/cd-system ────────────────────────────────────"
if [ "$SKIP_PULL" = "true" ]; then
    echo "  (saltado — ya estamos al día)"
else
    git pull origin cd-system 2>&1 | tail -15
    echo "  ✓ pull OK"
    echo "  nuevo HEAD: $(git log --oneline -1)"
fi

# ── 5. Dependencias + migraciones ────────────────────────────────────────
echo
echo "─── 5. Composer install + migraciones ──────────────────────────"
if [ -f composer.json ]; then
    # Solo si composer.lock cambió
    COMPOSER_CHANGED=$(git diff "$LOCAL"..HEAD --name-only 2>/dev/null | grep -c composer.lock || true)
    if [ "$COMPOSER_CHANGED" -gt 0 ]; then
        composer install --no-dev --optimize-autoloader --no-interaction 2>&1 | tail -5
    else
        echo "  ✓ composer.lock sin cambios — skip composer install"
    fi
fi

echo "  Migraciones pendientes:"
PENDING=$(php artisan migrate:status 2>&1 | grep -c "Pending" || true)
if [ "$PENDING" -gt 0 ]; then
    echo "    → $PENDING migraciones pendientes. Corriendo migrate..."
    php artisan migrate --force 2>&1 | tail -10
else
    echo "    (ninguna)"
fi

# ── 6. Flush caches + restart PHP-FPM ────────────────────────────────────
echo
echo "─── 6. Flush caches + restart PHP-FPM ──────────────────────────"
php artisan view:clear 2>&1 | tail -1
php artisan config:clear 2>&1 | tail -1
php artisan cache:clear 2>&1 | tail -1
rm -rf storage/framework/cache/data/* 2>/dev/null && echo "  ✓ site-config cache (TTL 24h) flushed"
chown -R supledev:supledev storage bootstrap/cache 2>/dev/null || true

# Restart PHP-FPM (puede requerir sudo — si falla, hay que correrlo aparte como root)
echo "  → restart php-fpm..."
if sudo systemctl restart php8.3-fpm 2>&1 | tail -2; then
    echo "  ✓ php8.3-fpm restarted"
elif sudo systemctl restart php-fpm 2>&1 | tail -2; then
    echo "  ✓ php-fpm restarted"
else
    echo "  ⚠️  No pude restart php-fpm — el opcache puede tardar en invalidar"
    echo "     Correlo manualmente: sudo systemctl restart php8.3-fpm"
fi

# ── 7. Verificar TN configurado ──────────────────────────────────────────
echo
echo "─── 7. Verificar credenciales TN en producción ─────────────────"
if [ -z "$TN_STORE_ID" ] || [ "$TN_TOKEN_SET" = "no" ]; then
    echo "  ⚠️  Faltan credenciales TN en .env producción."
    echo "     Agregá las siguientes lines al .env y volvé a correr el script:"
    echo
    echo "       TIENDANUBE_STORE_ID=4409024"
    echo "       TIENDANUBE_ACCESS_TOKEN=<rotar-y-poner-token-nuevo>"
    echo "       TIENDANUBE_USER_AGENT=\"BewPro (hola@bewpro.com)\""
    echo
    echo "     ⚠️  IMPORTANTE: ROTAR el token expuesto en el commit 24f43713 antes."
    SKIP_SYNC=true
else
    echo "  ✓ TN credenciales presentes — listo para sync"
    SKIP_SYNC=false
fi

# ── 8. Sync productos TN ─────────────────────────────────────────────────
echo
echo "─── 8. Sync productos TN ───────────────────────────────────────"
if [ "$SKIP_SYNC" = "true" ]; then
    echo "  (saltado — credenciales TN faltantes)"
else
    echo "  → dry-run primero..."
    php artisan tiendanube:sync-products --dry-run 2>&1 | tail -10
    echo
    if [ "$DRY_RUN_TN_AT_END" = "false" ]; then
        echo "  → sync REAL (DRY_RUN_TN_AT_END=false)..."
        php artisan tiendanube:sync-products 2>&1 | tail -10
        echo "  ✓ sync TN completo"
    else
        echo "  ⚠️  DRY_RUN_TN_AT_END=true — sync REAL no se ejecutó."
        echo "     Cuando quieras correr el sync real:"
        echo "       cd $TENANT_DIR && php artisan tiendanube:sync-products"
    fi
fi

# ── 9. Smoke test HTTP ───────────────────────────────────────────────────
echo
echo "─── 9. Smoke test HTTP rutas críticas ──────────────────────────"
for path in "/" "/products-catalogue" "/shop/cart" "/blog" "/faqs" "/contact" "/about"; do
    curl -s -o /dev/null -w "    %{http_code}  $path  (%{time_total}s)\n" \
        --max-time 15 "${DOMAIN}${path}?_b=${TS}" || echo "    ERR    $path"
done

echo
echo "═══════════════════════════════════════════════════════════════════"
echo "✅ Deploy completado — $(date '+%H:%M:%S')"
echo "═══════════════════════════════════════════════════════════════════"
echo
echo "🔍 Smoke test manual con Cmd+Shift+R:"
echo "   ${DOMAIN}/"
echo "   ${DOMAIN}/products-catalogue   ← verificar 74 productos TN si corrió sync"
echo
echo "📦 Si algo se ve roto y querés volver atrás:"
echo "   1. git stash list                                   # ver stashes"
echo "   2. git stash pop stash@{0}                           # restaurar files"
echo "   3. mysql $DB_NAME < <(gunzip -c ${BACKUP_FILE}.gz)   # restaurar DB"
echo
