#!/bin/bash
# integrate-worktrees.sh — Integra branches de worktrees a master con --no-ff
#
# Uso: ./integrate-worktrees.sh <slug-1> <slug-2> ...
# Ejemplo: ./integrate-worktrees.sh 0026-split-runtime 0027-prune-config-schema
#
# Para cada slug:
#   1. git merge --no-ff issue/<slug> a master
#   2. Verificar que master compila después del merge
#   3. Si hay conflict o fallo de build, PARAR inmediatamente
#
# Los slugs deben pasarse en el orden correcto (waves ya resueltas).
# NO hace push — eso lo decide el usuario.

set -euo pipefail

REPO_ROOT="$(git rev-parse --show-toplevel)"

if [ $# -eq 0 ]; then
  echo "ERROR: se necesita al menos un slug"
  echo "Uso: $0 <slug-1> <slug-2> ..."
  exit 1
fi

# Asegurar que estamos en master
echo "=== Cambiando a master ==="
cd "$REPO_ROOT"
git checkout master

MERGED=0
FAILED_AT=""

for slug in "$@"; do
  branch="issue/${slug}"

  echo ""
  echo "=== Integrando: ${branch} ==="

  # Verificar que la branch existe
  if ! git show-ref --verify --quiet "refs/heads/${branch}"; then
    echo "FAIL: branch ${branch} no existe"
    FAILED_AT="$slug"
    break
  fi

  # Merge --no-ff
  if ! git merge --no-ff "$branch" -m "merge: ${branch} — implementación paralela"; then
    echo ""
    echo "CONFLICT: merge de ${branch} tiene conflictos"
    echo "Resolver manualmente y luego continuar con los slugs restantes"
    echo ""
    echo "Para resolver:"
    echo "  1. git status  (ver archivos en conflicto)"
    echo "  2. Resolver conflictos en cada archivo"
    echo "  3. git add <archivos>"
    echo "  4. git commit"
    echo ""
    echo "Slugs pendientes después de ${slug}:"
    FOUND=0
    for remaining in "$@"; do
      if [ "$FOUND" -eq 1 ]; then
        echo "  - ${remaining}"
      fi
      if [ "$remaining" = "$slug" ]; then
        FOUND=1
      fi
    done
    exit 1
  fi

  echo "MERGED: ${branch}"

  # Verificar que master sigue compilando (si BUILD_CMD esta definido)
  if [ -n "${BUILD_CMD:-}" ]; then
    echo "--- Verificando build post-merge ($BUILD_CMD) ---"
    if ! (cd "$REPO_ROOT" && bash -c "$BUILD_CMD" 2>&1); then
      echo ""
      echo "FAIL: master no compila despues de mergear ${branch}"
      echo "Revertir con: git reset --hard HEAD~1"
      echo "Investigar el problema antes de continuar."
      FAILED_AT="$slug"
      break
    fi
    echo "OK: build post-merge exitoso"
  else
    echo "--- Build post-merge SKIPPED (BUILD_CMD no definido) ---"
  fi

  MERGED=$((MERGED + 1))
done

echo ""
echo "=== Resumen de integración ==="
echo "Mergeados: ${MERGED} de $#"

if [ -n "$FAILED_AT" ]; then
  echo "Falló en: ${FAILED_AT}"
  echo ""
  echo "Worktrees NO limpiados (resolver primero el fallo)"
  exit 1
fi

# Limpieza de worktrees y branches
echo ""
echo "=== Limpieza ==="
for slug in "$@"; do
  path="${REPO_ROOT}/worktrees/${slug}"
  branch="issue/${slug}"

  if [ -d "$path" ]; then
    git worktree remove "$path" 2>/dev/null && echo "REMOVED: worktree ${path}" || echo "WARN: no se pudo eliminar worktree ${path}"
  fi

  git branch -d "$branch" 2>/dev/null && echo "DELETED: branch ${branch}" || echo "WARN: no se pudo eliminar branch ${branch}"
done

echo ""
echo "=== Integración completa ==="
echo "Master tiene ${MERGED} merges nuevos."
echo ""
echo "Para publicar: git push"
