#!/usr/bin/env bash
set -uo pipefail

command -v pan >/dev/null 2>&1 || {
  printf "Error: pan no está instalado. Ejecutá: cargo install pandora-kit\n" >&2
  exit 1
}

CRATE_NAME=$(grep -E '^name' Cargo.toml | head -1 | sed -E 's/.*"([^"]+)".*/\1/')
VERSION=$(grep -E '^version' Cargo.toml | head -1 | sed -E 's/.*"([^"]+)".*/\1/')
[ -z "$VERSION" ] && { pan log error "No se pudo leer la versión de Cargo.toml"; exit 1; }

pan log info "Versión a publicar: $VERSION"

STEPS_RUN=()
STEPS_SKIP=()
STEPS_FAIL=()

run_step() {
  local title="$1"
  shift
  if pan spin -t "$title" -l -w -- "$@"; then
    STEPS_RUN+=("$title")
    return 0
  else
    local ec=$?
    STEPS_FAIL+=("$title")
    pan log error "Falló: $title"
    pan log warn "Recomendación: revisá los logs de arriba. Comando ejecutado: $*"
    return "$ec"
  fi
}

# ── 1. Tests ──
run_step "cargo test" cargo test || exit 1

# ── 2. Build ──
run_step "cargo build" cargo build || exit 1

# ── 3. Documentación (solo si git limpio y rama main) ──
GIT_STATUS=$(git status --porcelain 2>/dev/null)
GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
DO_DOC=true

if [ -n "$GIT_STATUS" ]; then
  pan log warn "git status tiene cambios sin commit — se omite cargo doc"
  STEPS_SKIP+=("cargo doc (git sucio)")
  DO_DOC=false
fi

if [ "$GIT_BRANCH" != "main" ]; then
  pan log warn "Rama actual '$GIT_BRANCH' no es main — se omite cargo doc"
  STEPS_SKIP+=("cargo doc (rama: $GIT_BRANCH)")
  DO_DOC=false
fi

if [ "$DO_DOC" = true ]; then
  run_step "cargo doc" cargo doc --no-deps || exit 1
fi

# ── 4. Pre-check de versión duplicada ──
pan log info "Verificando si la versión $VERSION ya existe en crates.io..."
PUBLISH_SHOULD_SKIP=false
if SEARCH_OUTPUT=$(cargo search "$CRATE_NAME" 2>&1); then
  if echo "$SEARCH_OUTPUT" | grep -qE "^$CRATE_NAME[[:space:]]*=[[:space:]]*\"$VERSION\""; then
    pan log warn "¡La versión $VERSION ya está publicada en crates.io!"
    pan log warn "Recomendación: incrementá la versión en Cargo.toml y volvé a ejecutar"
    STEPS_SKIP+=("cargo publish (v$VERSION ya publicada)")
    PUBLISH_SHOULD_SKIP=true
  else
    pan log info "Versión $VERSION no encontrada en crates.io — se puede publicar"
  fi
else
  pan log debug "cargo search falló (sin internet?) — se publica sin validación"
fi

# ── 5. Publicar ──
if [ "$PUBLISH_SHOULD_SKIP" = false ]; then
  if pan confirm -t "Publicar $VERSION" -m "¿Publicar la versión $VERSION a crates.io?" -v warning; then
    if pan spin -t "Publicando v$VERSION" -l -w -- cargo publish; then
      STEPS_RUN+=("cargo publish v$VERSION")
    else
      STEPS_FAIL+=("cargo publish v$VERSION")
      pan log error "Falló cargo publish"
      pan log warn "Recomendación: verificá credenciales (CARGO_REGISTRY_TOKEN), red, o si la versión ya fue subida manualmente"
    fi
  else
    pan log warn "Publicación cancelada por el usuario"
    STEPS_SKIP+=("cargo publish (cancelado)")
  fi
fi

# ── 6. Resumen ──
echo
pan log info "═══════════════════════════ RESUMEN ═══════════════════════════"
pan log info "Versión objetivo: $VERSION"
echo
pan log info "Ejecutados (${#STEPS_RUN[@]}):"
for s in "${STEPS_RUN[@]}"; do pan log info "  ✓ $s"; done
echo
pan log info "Saltados (${#STEPS_SKIP[@]}):"
for s in "${STEPS_SKIP[@]}"; do pan log warn "  ⊘ $s"; done
echo
pan log info "Fallados (${#STEPS_FAIL[@]}):"
for s in "${STEPS_FAIL[@]}"; do pan log error "  ✗ $s"; done
echo
pan log info "══════════════════════════════════════════════════════════════"

[ ${#STEPS_FAIL[@]} -eq 0 ]
