# Semana 16: mantenimiento, código heredado, deuda técnica y deprecación. Se usa
# dentro del contenedor del curso.
#
#   make              aplica las tres etapas del parallel change, y el cambio de
#                     la caja en SQL, a copias de Kallpa en build/, y corre su
#                     make check; la salida queda en build/logs/
#   make test         revisa los tipos (tsc), corre ESLint, prepara lo anterior y
#                     corre las pruebas (*.test.ts), que comprueban lo que dice el
#                     apunte
#   make golden       vuelve a guardar lo que responde la caja de Kallpa en
#                     golden/caja.json
#   make primera      la primera prueba de caracterización del cierre, que falla
#                     a propósito
#   make caja-agente  la caracterización contra la caja en SQL escrita para la
#                     clase, que falla a propósito
#   make etapas       cada etapa del parallel change, con cliente viejo y medición
#   make apurados     contraer sin migrar: make check en verde y la página rota
#   make migraciones  una migración incompatible y una compatible, con el código
#                     anterior corriendo encima
#   make facade       el strangler fig: la fachada delante de la Kallpa vieja
#   make renombrar    renombra priceCents en una copia con el servicio de TypeScript
#   make retroceso    ESLint impide agregar usos nuevos de lo deprecado
#   make ensayo       ensayo de la defensa: clon limpio y un cambio en vivo
#   make clean        borra build/
#
# Los ejemplos leen la Kallpa del curso (../../kallpa) sin modificarla.

KALLPA ?= ../../kallpa
GIT = git -c user.name=Kallpa -c user.email=kallpa@example.com -c init.defaultBranch=main
HERE = $(CURDIR)
export KALLPA

.PHONY: all stages test golden primera caja-agente etapas apurados migraciones facade renombrar retroceso ensayo clean

all: stages

# Cada etapa parte de la anterior. Un commit por etapa, como se integraría.
stages:
	rm -rf build/etapas build/logs build/caja-agente
	mkdir -p build/etapas build/logs
	cp -r $(KALLPA) build/etapas/0
	rm -f build/etapas/0/data/*.db build/etapas/0/data/*.db-*
	cd build/etapas/0 && $(GIT) init -q && $(GIT) add -A && $(GIT) commit -qm "Kallpa publicada"
	cp -r build/etapas/0 build/etapas/1
	cd build/etapas/1 && $(GIT) apply $(HERE)/parallel/1-expandir.diff && $(GIT) add -A && $(GIT) commit -qm "Expandir"
	cp -r build/etapas/1 build/etapas/2
	cd build/etapas/2 && $(GIT) apply $(HERE)/parallel/2-migrar.diff && $(GIT) add -A && $(GIT) commit -qm "Migrar"
	cp -r build/etapas/2 build/etapas/3
	cd build/etapas/3 && $(GIT) apply $(HERE)/parallel/3-contraer.diff && $(GIT) add -A && $(GIT) commit -qm "Contraer"
	cp -r build/etapas/3 build/etapas/apurados
	cd build/etapas/apurados && $(GIT) checkout -q HEAD~3 -- public/app.js && rm -f test/v2-migrado.test.ts
	cp -r build/etapas/0 build/caja-agente
	cd build/caja-agente && $(GIT) apply $(HERE)/caja/agente.diff
	$(MAKE) --no-print-directory -C build/etapas/1 check > build/logs/etapa-1.log 2>&1
	$(MAKE) --no-print-directory -C build/etapas/2 check > build/logs/etapa-2.log 2>&1
	$(MAKE) --no-print-directory -C build/etapas/3 check > build/logs/etapa-3.log 2>&1
	$(MAKE) --no-print-directory -C build/etapas/apurados check > build/logs/apurados.log 2>&1
	$(MAKE) --no-print-directory -C build/caja-agente check > build/logs/caja-agente.log 2>&1

test: all
	tsc -p .
	eslint .
	node --test "*.test.ts"

golden:
	node caja/fijar-caja.ts

primera:
	-node --test demos/primera-caracterizacion.check.ts

caja-agente:
	-node --test demos/caja-agente.check.ts

etapas: all
	@for n in 1 2 3; do echo "--- etapa $$n"; tail -8 build/logs/etapa-$$n.log | grep -E '^ℹ (tests|pass|fail)'; done
	node parallel/recorrido.ts

apurados: all
	@tail -8 build/logs/apurados.log | grep -E '^ℹ (tests|pass|fail)'
	@cd build/etapas/apurados && grep -n 'api(`/api/members' public/app.js

migraciones:
	node demos/migraciones.ts

facade:
	node demos/facade.ts

renombrar:
	node demos/renombrar.ts

retroceso:
	-eslint --no-config-lookup -c eslint.retroceso.js ejemplos/pagina-nueva.js

ensayo:
	bash ensayo/ensayo.sh

clean:
	rm -rf build
