#!/usr/bin/env bash
# Corre las demostraciones que necesitan una copia de Kallpa. Lo que imprime
# queda en build/logs/in-kallpa.txt y lo revisa in-kallpa.test.ts.
set -u
KALLPA=${KALLPA:-../../kallpa}
GIT="git -c user.name=Kallpa -c user.email=kallpa@example.com -c init.defaultBranch=main"
COPY=build/in-kallpa
RESUMEN='^(✔|✖|ℹ (tests|pass|fail) )'

prepare() {
  rm -rf "$COPY"
  mkdir -p build
  cp -r "$KALLPA" "$COPY"
  rm -f "$COPY"/data/*.db "$COPY"/data/*.db-*
  cp in-kallpa/*.test.ts "$COPY/test/"
  (cd "$COPY" && $GIT init -q && $GIT add -A && $GIT commit -qm "Kallpa publicada")
}

both() {
  (cd "$COPY" && node --test test/interaction.test.ts test/behavior.test.ts 2>&1 | grep -E "$RESUMEN" | sed -E 's/ \([0-9.]+ms\)//')
}

prepare
echo "== tipos de las demostraciones"
(cd "$COPY" && tsc -p . && echo "tsc sin errores")

echo "== Kallpa publicada"
both

echo "== refactoring: saveBooking pasa a llamarse insertBooking"
(cd "$COPY" && $GIT apply ../../in-kallpa/rename-save.diff && $GIT diff --stat)
(cd "$COPY" && node --test "test/http.test.ts" 2>&1 | grep -E '^ℹ (pass|fail) ')
both
(cd "$COPY" && node --test test/interaction.test.ts 2>&1 | grep -m1 -E 'is not a function')

prepare
echo "== error: el repositorio guarda siempre 1 hora"
(cd "$COPY" && $GIT apply ../../in-kallpa/bug-insert.diff && $GIT diff --stat)
both
(cd "$COPY" && node --test test/behavior.test.ts 2>&1 | grep -A8 -m1 'AssertionError' | sed -n 1,9p)

prepare
COV="--experimental-test-coverage --test-coverage-include=src/domain/pricing.ts"
TABLA='pricing.ts|^ℹ (pass|fail) '
echo "== una sola rama"
(cd "$COPY" && node --test $COV test/one-branch.test.ts 2>&1 | grep -E "$TABLA")

echo "== sin aserciones, pricing.ts correcto"
(cd "$COPY" && node --test $COV test/no-assert.test.ts 2>&1 | grep -E "$TABLA")

echo "== sin aserciones, descuento de socio de 50 %"
(cd "$COPY" && sed -i 's/SOCIO_DISCOUNT_PERCENT = 10;/SOCIO_DISCOUNT_PERCENT = 50;/' src/domain/pricing.ts)
(cd "$COPY" && node --test $COV test/no-assert.test.ts 2>&1 | grep -E "$TABLA")
echo "== las pruebas de pricing.test.ts con el mismo error"
(cd "$COPY" && node --test test/pricing.test.ts 2>&1 | grep -E '^ℹ (pass|fail) |^ *✖ los socios' | sed -E 's/ \([0-9.]+ms\)//' | sort -u)
