#!/bin/bash
# sync-scripts.sh — Detecta o aplica drift entre /root/scripts/ del VPS y infrastructure/scripts/ del repo.
#
# Uso:
#   sync-scripts.sh --check        # Solo reporta diferencias (exit 0 = sin drift, 1 = drift)
#   sync-scripts.sh --apply        # Aplica repo → VPS (sobrescribe local con repo)
#   sync-scripts.sh --slack        # Si --check encuentra drift, postea a Slack
#
# Cron sugerido (root VPS1):
#   0 7 * * * /root/scripts/sync-scripts.sh --check --slack >> /var/log/bewpro/sync.log 2>&1

set -uo pipefail

REPO_URL="git@github.com:LACOMPANIADIGITAL/cd-system.git"
BRANCH="cd-system"
WORK="/root/.cache/bewpro-sync"
LOG_PREFIX="[sync-scripts $(date -Iseconds)]"

MODE_CHECK=false
MODE_APPLY=false
USE_SLACK=false
for arg in "$@"; do
  case "$arg" in
    --check) MODE_CHECK=true ;;
    --apply) MODE_APPLY=true ;;
    --slack) USE_SLACK=true ;;
    --help|-h)
      sed -n '2,12p' "$0"
      exit 0
      ;;
  esac
done

if ! $MODE_CHECK && ! $MODE_APPLY; then
  echo "ERROR: usar --check o --apply" >&2
  exit 1
fi

# 1. Asegurar working copy del repo
mkdir -p "$WORK"
if [ ! -d "$WORK/.git" ]; then
  echo "$LOG_PREFIX clonando repo en $WORK..."
  git clone --depth=1 --branch="$BRANCH" "$REPO_URL" "$WORK" >/dev/null 2>&1 || { echo "ERROR: git clone falló" >&2; exit 2; }
else
  git -C "$WORK" fetch --depth=1 origin "$BRANCH" >/dev/null 2>&1 || { echo "ERROR: git fetch falló" >&2; exit 2; }
  git -C "$WORK" reset --hard "origin/$BRANCH" >/dev/null 2>&1
fi

REPO_HEAD=$(git -C "$WORK" rev-parse --short HEAD)
echo "$LOG_PREFIX repo HEAD: $REPO_HEAD"

# 2. Mapping repo path → VPS path
declare -A FILES=(
  ["infrastructure/scripts/orchestrator/process-airtable.sh"]="/root/scripts/process-airtable.sh"
  ["infrastructure/scripts/orchestrator/process_provision_queue.sh"]="/root/scripts/process_provision_queue.sh"
  ["infrastructure/scripts/provisioner/setup_cd_project4.sh"]="/root/scripts/setup_cd_project4.sh"
  ["infrastructure/scripts/provisioner/setup_cd_project2.sh"]="/root/scripts/setup_cd_project2.sh"
  ["infrastructure/scripts/provisioner/send-welcome-email.php"]="/root/scripts/send-welcome-email.php"
  ["infrastructure/scripts/billing/check-subscriptions.sh"]="/root/scripts/check-subscriptions.sh"
  ["infrastructure/scripts/billing/process-suspensions.sh"]="/root/scripts/process-suspensions.sh"
  ["infrastructure/scripts/billing/manage-grace-period.sh"]="/root/scripts/manage-grace-period.sh"
  ["infrastructure/scripts/utility/fix-ssl.sh"]="/root/scripts/fix-ssl.sh"
  ["infrastructure/scripts/utility/fix-mysql-user.sh"]="/root/scripts/fix-mysql-user.sh"
  ["infrastructure/scripts/utility/delete-project.sh"]="/root/scripts/delete-project.sh"
  ["infrastructure/scripts/utility/delete-multiple-projects.sh"]="/root/scripts/delete-multiple-projects.sh"
  ["infrastructure/scripts/email-pipes/email_to_slack.php"]="/home/lacompany/scripts/email_to_slack.php"
)

# 3. Diff por archivo
DRIFT_COUNT=0
DRIFT_DETAILS=""

for repo_path in "${!FILES[@]}"; do
  vps_path="${FILES[$repo_path]}"
  src="$WORK/$repo_path"

  if [ ! -f "$src" ]; then
    DRIFT_COUNT=$((DRIFT_COUNT+1))
    DRIFT_DETAILS+="MISSING_IN_REPO: $repo_path\n"
    continue
  fi

  if [ ! -f "$vps_path" ]; then
    DRIFT_COUNT=$((DRIFT_COUNT+1))
    DRIFT_DETAILS+="MISSING_IN_VPS:  $vps_path\n"
    if $MODE_APPLY; then
      mkdir -p "$(dirname "$vps_path")"
      cp "$src" "$vps_path"
      echo "$LOG_PREFIX  → installed $vps_path"
    fi
    continue
  fi

  if ! cmp -s "$src" "$vps_path"; then
    DRIFT_COUNT=$((DRIFT_COUNT+1))
    LINES_DIFF=$(diff "$vps_path" "$src" | wc -l)
    DRIFT_DETAILS+="DIFFERS: $vps_path  (Δ ~$LINES_DIFF lines)\n"
    if $MODE_APPLY; then
      cp "$vps_path" "${vps_path}.bak-pre-sync-$(date +%Y%m%d-%H%M%S)"
      cp "$src" "$vps_path"
      echo "$LOG_PREFIX  → updated $vps_path (backup creado)"
    fi
  fi
done

# 4. Permisos correctos en --apply
if $MODE_APPLY; then
  chmod +x /root/scripts/*.sh 2>/dev/null || true
  chown lacompany:lacompany /home/lacompany/scripts/email_to_slack.php 2>/dev/null || true
  chmod 750 /home/lacompany/scripts/email_to_slack.php 2>/dev/null || true
fi

# 5. Reporte
echo "$LOG_PREFIX drift total: $DRIFT_COUNT archivo(s)"
if [ "$DRIFT_COUNT" -gt 0 ]; then
  echo -e "$DRIFT_DETAILS"
fi

# 6. Slack si corresponde
if $USE_SLACK && $MODE_CHECK && [ "$DRIFT_COUNT" -gt 0 ]; then
  source /root/scripts/.airtable.env 2>/dev/null || true
  if [ -n "${SLACK_WEBHOOK_URL:-}" ]; then
    MSG=$(printf '⚠️ *Sync drift VPS↔repo* — %d archivo(s) divergen del repo (HEAD %s)\\n\\n%s\\nResolver: ssh vps1 \\"sync-scripts.sh --apply\\" para forzar repo→VPS, o subir cambios al repo.' "$DRIFT_COUNT" "$REPO_HEAD" "$DRIFT_DETAILS")
    curl -s -X POST -H 'Content-Type: application/json' \
      --data "{\"text\": \"$MSG\"}" \
      "$SLACK_WEBHOOK_URL" >/dev/null 2>&1 || true
    echo "$LOG_PREFIX Slack notification posted"
  fi
fi

# Exit 1 si hubo drift y estamos en --check
if $MODE_CHECK && [ "$DRIFT_COUNT" -gt 0 ]; then
  exit 1
fi
exit 0
