#!/usr/bin/env bash
# Escenarios del apunte que no usan la red: cada uno trabaja en una copia de
# Kallpa dentro de build/. Los comandos que importan se imprimen con $.
set -u
unset MAKELEVEL MAKEFLAGS MFLAGS
HERE="$(cd "$(dirname "$0")" && pwd)"
KALLPA="${KALLPA:-$HERE/../../kallpa}"
GIT=(git -c user.name=Kallpa -c user.email=kallpa@example.com -c init.defaultBranch=main)

# Con una tubería, el código de salida sería el del último comando: no se muestra.
show() {
  echo; echo "\$ $*"
  bash -c "$*" 2>&1
  local code=$?
  case "$*" in *\|*) ;; *) echo "[código de salida: $code]" ;; esac
}

fresh() {
  local dir="$HERE/build/$1"
  rm -rf "$dir"
  mkdir -p "$HERE/build"
  cp -r "$KALLPA" "$dir"
  rm -f "$dir"/data/*.db "$dir"/data/*.db-*
  cd "$dir" || exit 2
  "${GIT[@]}" init -q
  "${GIT[@]}" add -A
  "${GIT[@]}" commit -qm "Kallpa publicada"
}

case "${1:-}" in
  tipos)
    fresh tipos
    # Node solo quita los tipos: a formatSoles le llega un string, y como
    # cents / 100 lo convierte en número, el resultado es el mismo.
    sed -i 's/formatSoles(c.priceCents)/formatSoles(String(c.priceCents))/' src/notifications/notifier.ts
    show "git --no-pager diff -U0 | tail -3 | cut -c1-120"
    show "make test | tail -8"
    show "make typecheck"
    ;;
  colision)
    fresh colision
    # Rama A: cambia el nombre de formatSoles en todas las líneas donde se usa.
    "${GIT[@]}" switch -qc renombra-soles
    sed -i 's/formatSoles/centsToSoles/g' src/domain/pricing.ts src/notifications/notifier.ts test/pricing.test.ts
    "${GIT[@]}" commit -qam "Renombra formatSoles a centsToSoles"
    echo "--- rama renombra-soles"
    make check >/dev/null 2>&1; echo "make check: código de salida $?"
    # Rama B, desde el mismo punto: usa la función con su nombre de siempre.
    "${GIT[@]}" switch -q main
    "${GIT[@]}" switch -qc linea-de-caja
    cat >> src/domain/report.ts <<'TS'

// Una línea para imprimir la caja del día.
export function summaryLine(summary: DailySummary): string {
  return `${summary.date}: ${summary.bookings} reservas, ${formatSoles(summary.revenueCents)}`;
}
TS
    sed -i "1i import { formatSoles } from './pricing.ts';" src/domain/report.ts
    "${GIT[@]}" commit -qam "Agrega la línea de caja del día"
    echo "--- rama linea-de-caja"
    make check >/dev/null 2>&1; echo "make check: código de salida $?"
    echo "--- las dos juntas"
    "${GIT[@]}" switch -q main
    "${GIT[@]}" merge -q --no-edit renombra-soles
    export GIT_AUTHOR_NAME=Kallpa GIT_AUTHOR_EMAIL=kallpa@example.com GIT_COMMITTER_NAME=Kallpa GIT_COMMITTER_EMAIL=kallpa@example.com
    show "git merge --no-edit linea-de-caja"
    show "make check"
    ;;
  zona)
    cd "$HERE" || exit 2
    show "TZ=America/Lima node --test ejemplos/fecha-local.check.ts | grep -E '^(✔|✖) la fecha|^ℹ (pass|fail)'"
    show "TZ=UTC node --test ejemplos/fecha-local.check.ts | grep -E '^(✔|✖) la fecha|^ℹ (pass|fail)' | head -4"
    ;;
  *)
    echo "Uso: escenarios.sh tipos|colision|zona" >&2
    exit 2
    ;;
esac
