#!/usr/bin/env bash
# Repite, paso por paso, el ciclo de TDD del capítulo sobre una copia de Kallpa
# (build/tdd). Cada paso copia los archivos de tdd/steps/NN-... y corre las
# pruebas; la salida de cada corrida queda en build/logs/tdd/. Cada ciclo termina
# en un commit con fecha fija, para que los hashes sean siempre los mismos.
set -u
KALLPA=${KALLPA:-../../kallpa}
REPO=build/tdd
LOGS=$PWD/build/logs/tdd
rm -rf "$REPO" "$LOGS"
mkdir -p build "$LOGS"
cp -r "$KALLPA" "$REPO"
rm -f "$REPO"/data/*.db "$REPO"/data/*.db-*

MINUTE=0
commit() {
  MINUTE=$((MINUTE + 7))
  local when
  when=$(printf '2026-03-09T10:%02d:00-05:00' "$MINUTE")
  (cd "$REPO" && git add -A -- "${@:2}" && GIT_AUTHOR_DATE=$when GIT_COMMITTER_DATE=$when \
    git -c user.name=Kallpa -c user.email=kallpa@example.com commit -qm "$1")
}

# Corre un archivo de pruebas. Guarda la salida y el código de salida.
run() {
  local name=$1 file=$2
  (cd "$REPO" && node --test "$file" > "$LOGS/$name.txt" 2>&1; echo $? > "$LOGS/$name.status")
}

# Copia los archivos de un paso y corre las pruebas.
step() {
  cp -r "tdd/steps/$1/." "$REPO/"
  run "$1" "$2"
}

# Tipos y linter antes de cada commit: lo que entra al repositorio está limpio.
lint() {
  (cd "$REPO" && make --no-print-directory typecheck lint > "$LOGS/$1-lint.txt" 2>&1; echo $? > "$LOGS/$1-lint.status")
}

(cd "$REPO" && git -c init.defaultBranch=main init -q)
commit "Kallpa publicada" .

# El ciclo de afuera: la prueba de aceptación queda en rojo y no entra a ningún
# commit hasta que pase, para que cada commit tenga todas sus pruebas en verde.
step 00-acceptance test/busiest-hour-http.test.ts

step 01-red-missing test/busiest-hour.test.ts
step 01-red test/busiest-hour.test.ts
step 01-green test/busiest-hour.test.ts
lint 01
commit "Sin reservas no hay hora más pedida" src/domain/busiest-hour.ts test/busiest-hour.test.ts

step 02-red test/busiest-hour.test.ts
step 02-green test/busiest-hour.test.ts
lint 02
commit "Con una reserva, la más pedida es su hora de inicio" src/domain/busiest-hour.ts test/busiest-hour.test.ts

step 03-red test/busiest-hour.test.ts
step 03-green test/busiest-hour.test.ts
lint 03
commit "Cuenta cada hora de las reservas largas" src/domain/busiest-hour.ts test/busiest-hour.test.ts

step 04-red test/busiest-hour.test.ts
step 04-green test/busiest-hour.test.ts
step 04-refactor test/busiest-hour.test.ts
lint 04
commit "En un empate gana la hora más temprana" src/domain/busiest-hour.ts test/busiest-hour.test.ts

# De vuelta en el ciclo de afuera: conectar el dominio con la caja del día.
(cd "$REPO" && git apply ../../tdd/report-busiest-hour.diff)
run 05-acceptance test/busiest-hour-http.test.ts
(cd "$REPO" && make check > "$LOGS/05-check.txt" 2>&1; echo $? > "$LOGS/05-check.status")
commit "La caja del día dice la hora más pedida" .

(cd "$REPO" && git log --reverse --format='%h %s') > "$LOGS/log.txt"
