#!/usr/bin/env bash
# promote.sh — promote a feature from staging to prod
#
# Three steps in order:
#   1. File sync   — copy changed PWA files from /var/www/360lm → /var/www/360lm-prod
#   2. DB migrate  — apply pending migrations to lm360_prod
#   3. Data sync   — copy new recce submissions staging → prod
#
# Usage:
#   bash /var/www/360lm/promote.sh              # interactive (asks before each step)
#   bash /var/www/360lm/promote.sh --yes        # non-interactive (apply everything)
#   bash /var/www/360lm/promote.sh --files-only # only sync files, skip DB steps

set -euo pipefail

AUTO_YES=false
FILES_ONLY=false
for arg in "$@"; do
  [[ "$arg" == "--yes"        ]] && AUTO_YES=true
  [[ "$arg" == "--files-only" ]] && FILES_ONLY=true
done

DEV_DIR=/var/www/360lm
PROD_DIR=/var/www/360lm-prod
PG=lmadmin
STAGING=lm360
PROD=lm360_prod
C=postgres
PROD_SCHEMAS="activity custodian expense hub recce sales"

# PWA subdirectories that exist in prod
PROD_PWAS="activity admin finance hub recce shared"

echo ""
echo "============================================"
echo "  360LM: Staging → Prod promotion"
echo "============================================"
echo ""

# ══════════════════════════════════════════════
# STEP 1 — FILE SYNC
# ══════════════════════════════════════════════
echo "── Step 1: File changes ──────────────────"
echo ""

CHANGED_FILES=()
for pwa in $PROD_PWAS; do
  [ -d "$DEV_DIR/$pwa" ] || continue
  [ -d "$PROD_DIR/$pwa" ] || continue
  while IFS= read -r line; do
    # diff -rq lines look like: "Files X and Y differ"
    if [[ "$line" == Files* ]]; then
      src=$(echo "$line" | awk '{print $2}')
      CHANGED_FILES+=("$src")
    fi
  done < <(diff -rq \
    --exclude="*.sql" --exclude="*.sh" --exclude="*.log" \
    --exclude=".DS_Store" \
    "$DEV_DIR/$pwa" "$PROD_DIR/$pwa" 2>/dev/null || true)
done

if [[ ${#CHANGED_FILES[@]} -eq 0 ]]; then
  echo "✓ No file changes — prod files match staging."
else
  echo "Files changed in staging (not yet in prod):"
  echo ""
  for f in "${CHANGED_FILES[@]}"; do
    rel=${f#$DEV_DIR/}
    echo "  ✎  $rel"
  done
  echo ""

  if ! $AUTO_YES; then
    read -rp "Copy these files to prod? [y/N] " CONFIRM
    [[ "$CONFIRM" =~ ^[Yy]$ ]] || { echo "File sync skipped."; echo ""; }
    if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
      for f in "${CHANGED_FILES[@]}"; do
        rel=${f#$DEV_DIR/}
        dest="$PROD_DIR/$rel"
        mkdir -p "$(dirname "$dest")"
        cp "$f" "$dest"
        echo "  ✓ copied $rel"
      done
    fi
  else
    for f in "${CHANGED_FILES[@]}"; do
      rel=${f#$DEV_DIR/}
      dest="$PROD_DIR/$rel"
      mkdir -p "$(dirname "$dest")"
      cp "$f" "$dest"
      echo "  ✓ copied $rel"
    done
  fi
fi

$FILES_ONLY && { echo ""; echo "✓ Files-only mode — done."; echo ""; exit 0; }

# ══════════════════════════════════════════════
# STEP 2 — DB MIGRATIONS
# ══════════════════════════════════════════════
echo ""
echo "── Step 2: Pending migrations ────────────"
echo ""

docker exec -i $C psql -U $PG -d $STAGING -q -c "CREATE EXTENSION IF NOT EXISTS dblink;" 2>/dev/null || true
PENDING=$(docker exec -i $C psql -U $PG -d $STAGING -t -c "
  SELECT name FROM public._migrations
  EXCEPT
  SELECT name FROM dblink(
    'host=localhost port=5432 dbname=$PROD user=$PG',
    'SELECT name FROM public._migrations'
  ) AS p(name text)
  ORDER BY 1;
" 2>/dev/null | grep -v "^$" | sed 's/^ *//' || true)

if [[ -z "$PENDING" ]]; then
  echo "✓ No pending migrations."
else
  APPLICABLE=()
  SKIPPED=()
  while IFS= read -r name; do
    FILE=$(find "$DEV_DIR" -name "${name}.sql" 2>/dev/null | head -1)
    if [[ -z "$FILE" ]]; then
      SKIPPED+=("$name (file not found)")
      continue
    fi
    DIR=$(basename "$(dirname "$FILE")")
    if echo "$PROD_SCHEMAS" | grep -qw "$DIR"; then
      APPLICABLE+=("$name|$FILE")
    else
      SKIPPED+=("$name (staging-only: $DIR)")
    fi
  done <<< "$PENDING"

  if [[ ${#APPLICABLE[@]} -gt 0 ]]; then
    echo "Will apply to prod:"
    for entry in "${APPLICABLE[@]}"; do
      name=${entry%%|*}
      echo "  ✓ $name"
    done
  fi
  if [[ ${#SKIPPED[@]} -gt 0 ]]; then
    echo "Staging-only (skip):"
    for s in "${SKIPPED[@]}"; do
      echo "  ─ $s"
    done
  fi
  echo ""

  if [[ ${#APPLICABLE[@]} -gt 0 ]]; then
    if ! $AUTO_YES; then
      read -rp "Apply migrations to $PROD? [y/N] " CONFIRM2
      [[ "$CONFIRM2" =~ ^[Yy]$ ]] || { echo "Migration skipped."; APPLICABLE=(); }
    fi
    for entry in "${APPLICABLE[@]}"; do
      name=${entry%%|*}; FILE=${entry##*|}
      echo "▶ $name ..."
      docker exec -i $C psql -U $PG -d $PROD -q < "$FILE"
      docker exec -i $C psql -U $PG -d $PROD -q -c \
        "INSERT INTO public._migrations(name) VALUES ('$name') ON CONFLICT DO NOTHING;"
      echo "  ✓ done"
    done
  fi
fi

# ══════════════════════════════════════════════
# STEP 3 — DATA SYNC
# ══════════════════════════════════════════════
echo ""
echo "── Step 3: Recce data sync ───────────────"
echo ""

NEW_ROWS=$(docker exec -i $C pg_dump \
  -U $PG -d $STAGING \
  --data-only --table=recce.submissions \
  --inserts --on-conflict-do-nothing 2>/dev/null \
  | grep -c "^INSERT" || true)

if [[ "$NEW_ROWS" -eq 0 ]]; then
  echo "✓ No new recce submissions to sync."
else
  PROD_COUNT_BEFORE=$(docker exec -i $C psql -U $PG -d $PROD -t -c \
    "SELECT COUNT(*) FROM recce.submissions;" | tr -d ' \n')
  echo "$NEW_ROWS staging row(s) found  |  prod currently has $PROD_COUNT_BEFORE rows"
  echo "(ON CONFLICT DO NOTHING — rows already in prod are never overwritten)"
  echo ""
  if ! $AUTO_YES; then
    read -rp "Sync recce data to prod? [y/N] " CONFIRM3
    [[ "$CONFIRM3" =~ ^[Yy]$ ]] || { echo "Data sync skipped."; echo ""; }
    if [[ "$CONFIRM3" =~ ^[Yy]$ ]]; then
      docker exec -i $C pg_dump \
        -U $PG -d $STAGING --data-only --table=recce.submissions \
        --inserts --on-conflict-do-nothing \
        | docker exec -i $C psql -U $PG -d $PROD -q
      echo "✓ Synced."
    fi
  else
    docker exec -i $C pg_dump \
      -U $PG -d $STAGING --data-only --table=recce.submissions \
      --inserts --on-conflict-do-nothing \
      | docker exec -i $C psql -U $PG -d $PROD -q
    echo "✓ Synced."
  fi
fi

PROD_FINAL=$(docker exec -i $C psql -U $PG -d $PROD -t -c \
  "SELECT COUNT(*) FROM recce.submissions;" | tr -d ' \n')

echo ""
echo "============================================"
echo "  Prod recce.submissions: $PROD_FINAL rows"
echo "  Promotion complete."
echo "============================================"
echo ""
