#!/usr/bin/env bash
# =============================================================================
# Extrae de GitHub todo lo que NO vive dentro del repositorio git.
#
# El clonado espejo captura código, ramas, etiquetas y todo el historial de
# commits. Pero las conversaciones, revisiones, incidencias y ejecuciones de
# integración continua viven solo en la plataforma, y se pierden si se pierde
# el acceso a la cuenta que aloja el repositorio.
#
# Uso: GH_TOKEN=... ./extraer-github.sh <destino> [owner/repo]
# =============================================================================
set -uo pipefail

DEST="${1:?falta el directorio de destino}"
REPO="${2:-itproviders-netizen/kynda-poc}"
M="$DEST/metadatos"
mkdir -p "$M/comentarios-pr" "$M/revisiones-pr" "$M/ci"

g() { gh api "$1" --paginate 2>/dev/null; }
n() { python3 -c "import json,sys;d=json.load(open('$1'));print(len(d) if isinstance(d,list) else 1)" 2>/dev/null || echo 0; }
linea() { printf "  %-32s %s\n" "$1" "$2"; }

echo "--- Repositorio y configuración ---"
gh api "repos/$REPO"                    > "$M/repositorio.json" 2>/dev/null; linea "repositorio" "$(n "$M/repositorio.json")"
g "repos/$REPO/branches"                > "$M/ramas.json";        linea "ramas"          "$(n "$M/ramas.json")"
g "repos/$REPO/tags"                    > "$M/etiquetas.json";    linea "etiquetas"      "$(n "$M/etiquetas.json")"
g "repos/$REPO/collaborators"           > "$M/colaboradores.json";linea "colaboradores"  "$(n "$M/colaboradores.json")"
g "repos/$REPO/releases"                > "$M/releases.json";     linea "releases"       "$(n "$M/releases.json")"
g "repos/$REPO/labels"                  > "$M/etiquetas-issues.json"; linea "etiquetas de incidencia" "$(n "$M/etiquetas-issues.json")"
g "repos/$REPO/milestones?state=all"    > "$M/hitos.json";        linea "hitos"          "$(n "$M/hitos.json")"

echo "--- Historial de commits con detalle ---"
g "repos/$REPO/commits?per_page=100"    > "$M/commits.json";      linea "commits"        "$(n "$M/commits.json")"

echo "--- Incidencias y sus conversaciones ---"
g "repos/$REPO/issues?state=all&per_page=100"          > "$M/incidencias.json"; linea "incidencias y PR" "$(n "$M/incidencias.json")"
g "repos/$REPO/issues/comments?per_page=100"           > "$M/comentarios-incidencias.json"; linea "comentarios" "$(n "$M/comentarios-incidencias.json")"

echo "--- Pull requests, revisiones y comentarios ---"
g "repos/$REPO/pulls?state=all&per_page=100"           > "$M/pull-requests.json"; linea "pull requests" "$(n "$M/pull-requests.json")"
g "repos/$REPO/pulls/comments?per_page=100"            > "$M/comentarios-codigo.json"; linea "comentarios de código" "$(n "$M/comentarios-codigo.json")"

# Revisiones y commits por cada pull request
NUMS=$(python3 -c "
import json
try:
    d=json.load(open('$M/pull-requests.json'))
    print(' '.join(str(p['number']) for p in d))
except Exception: pass
")
CR=0; CC=0
for num in $NUMS; do
  gh api "repos/$REPO/pulls/$num/reviews" --paginate > "$M/revisiones-pr/$num.json" 2>/dev/null && CR=$((CR+1))
  gh api "repos/$REPO/pulls/$num/comments" --paginate > "$M/comentarios-pr/$num.json" 2>/dev/null && CC=$((CC+1))
done
linea "revisiones descargadas" "$CR"
linea "hilos de comentarios" "$CC"

echo "--- Integración continua ---"
g "repos/$REPO/actions/workflows"                       > "$M/ci/workflows.json"; linea "workflows" "$(n "$M/ci/workflows.json")"
gh api "repos/$REPO/actions/runs?per_page=100" --paginate --jq '[.workflow_runs[]]' 2>/dev/null \
  | python3 -c "
import json,sys
todo=[]
for l in sys.stdin.read().split(']['):
    l = l if l.startswith('[') else '['+l
    l = l if l.endswith(']') else l+']'
    try: todo.extend(json.loads(l))
    except Exception: pass
json.dump(todo, open('$M/ci/ejecuciones.json','w'), indent=2)
print(len(todo))
" | sed 's/^/  ejecuciones de CI                /'

echo "--- Elementos que requieren permisos de administración ---"
for par in "hooks:webhooks" "actions/secrets:secretos (solo nombres)" "actions/variables:variables"; do
  ruta="${par%%:*}"; nom="${par##*:}"
  if gh api "repos/$REPO/$ruta" > "$M/${ruta//\//-}.json" 2>/dev/null; then
    linea "$nom" "$(n "$M/${ruta//\//-}.json")"
  else
    linea "$nom" "sin acceso (requiere admin)"
    rm -f "$M/${ruta//\//-}.json"
  fi
done

echo "Extracción de metadatos terminada."
