#!/bin/bash
# ============================================================
# Migration script for cPanel Passenger deployments
# Called by app.js on every startup — safe to run repeatedly
# Handles: old migration names, P3009, column existence checks
# Does NOT backup or start the app (those are app.js's job)
# ============================================================
set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
APP_DIR="$(dirname "$SCRIPT_DIR")"

# Load production env
if [ -f "$APP_DIR/.env.production" ]; then
  set -a
  # shellcheck disable=SC1091
  source "$APP_DIR/.env.production"
  set +a
fi

# Force binary engines — prevents WASM OOM on cPanel shared hosting
# Prisma 7+ defaults to WASM which crashes with RangeError on low-memory hosts
export PRISMA_CLI_QUERY_ENGINE_TYPE=binary
export PRISMA_SCHEMA_ENGINE_TYPE=binary
export PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING=1

# Parse DATABASE_URL → DB credentials
if [ -n "$DATABASE_URL" ]; then
  DB_USER=$(echo "$DATABASE_URL" | sed -n 's|mysql://\([^:]*\):.*|\1|p')
  DB_PASS=$(echo "$DATABASE_URL" | sed -n 's|mysql://[^:]*:\([^@]*\)@.*|\1|p')
  DB_HOST=$(echo "$DATABASE_URL" | sed -n 's|mysql://[^@]*@\([^:/]*\).*|\1|p')
  DB_PORT=$(echo "$DATABASE_URL" | sed -n 's|.*:\([0-9][0-9]*\)/.*|\1|p')
  DB_NAME=$(echo "$DATABASE_URL" | sed -n 's|.*/\([^?]*\).*|\1|p')
fi

# Fallback to individual env vars
DB_USER="${DB_USER:-${DB_USERNAME:-root}}"
DB_PASS="${DB_PASS:-${DB_PASSWORD:-}}"
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-3306}"
DB_NAME="${DB_NAME:-${DB_DATABASE:-les_vrais_naturels}}"

MYSQL_Q="mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASS"

echo "[migrate-cpanel] DB: $DB_NAME @ $DB_HOST:$DB_PORT"

# ── Step 1: Fix old migration names (20260223*) ────────────────────────────────
OLD_COUNT=$($MYSQL_Q "$DB_NAME" \
  -sse "SELECT COUNT(*) FROM \`_prisma_migrations\` WHERE migration_name LIKE '202602%';" \
  2>/dev/null || echo "0")

if [ "$OLD_COUNT" -gt "0" ] 2>/dev/null; then
  echo "[migrate-cpanel] Old migration names detected ($OLD_COUNT). Fixing..."
  $MYSQL_Q "$DB_NAME" < "$SCRIPT_DIR/fix-migration-history.sql" 2>/dev/null \
    && echo "[migrate-cpanel] Migration history fixed" \
    || echo "[migrate-cpanel] WARNING: fix-migration-history.sql failed"
fi

# ── Step 2: Resolve any failed migrations (P3009 prevention) ──────────────────
FAILED=$($MYSQL_Q "$DB_NAME" \
  -sse "SELECT migration_name FROM \`_prisma_migrations\` WHERE finished_at IS NULL AND rolled_back_at IS NULL ORDER BY started_at;" \
  2>/dev/null || echo "")

if [ -n "$FAILED" ]; then
  echo "[migrate-cpanel] Failed migrations found. Resolving..."
  for m in $FAILED; do
    echo "  -> Resolving: $m"
    npx prisma migrate resolve --applied "$m" 2>/dev/null \
      && echo "  OK: $m" || echo "  WARNING: could not resolve $m"
  done
fi

# ── Step 3: If unitSaleRule column exists but 0002 not recorded, mark applied ──
UNIT_COL=$($MYSQL_Q \
  -sse "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='products' AND COLUMN_NAME='unitSaleRule';" \
  2>/dev/null || echo "0")
HAS_0002=$($MYSQL_Q "$DB_NAME" \
  -sse "SELECT COUNT(*) FROM \`_prisma_migrations\` WHERE migration_name='0002_add_unit_sale_rule' AND finished_at IS NOT NULL;" \
  2>/dev/null || echo "0")

if [ "$UNIT_COL" -gt "0" ] 2>/dev/null && [ "$HAS_0002" -eq "0" ] 2>/dev/null; then
  echo "[migrate-cpanel] unitSaleRule exists but 0002 not recorded — resolving..."
  npx prisma migrate resolve --applied "0002_add_unit_sale_rule" 2>/dev/null \
    && echo "[migrate-cpanel] 0002 resolved" || true
fi

# ── Step 4: Run migrations ─────────────────────────────────────────────────────
echo "[migrate-cpanel] Running prisma migrate deploy..."
if npx prisma migrate deploy; then
  echo "[migrate-cpanel] All migrations applied successfully"
else
  echo "[migrate-cpanel] WARNING: prisma migrate deploy failed (app will still start)"
fi
