# Semana 7: arquitectura y decisiones de arquitectura. Se usa dentro del
# contenedor del curso.
#
#   make                copia Kallpa en build/kallpa, build/solo-espera y
#                       build/transaccion (con su .diff aplicado)
#   make test           revisa los tipos (tsc), corre ESLint y las pruebas
#                       (*.test.ts), que comprueban lo que dice el apunte
#   make dependencias   el paso 1 del laboratorio: quién importa a quién
#   make capas          Kallpa revisada con las reglas de capas-eslint.js
#   make cruce          un cambio que cruza capas: pasa make check, no la regla
#   make dos-instancias el paso 4 del laboratorio, sobre build/kallpa
#   make medir          el escenario de calidad con cada variante
#   make reinicio       cuánto tarda Kallpa en volver después de una caída
#   make clean          borra build/
#
# Nada de esto modifica la Kallpa del curso (../../kallpa).

KALLPA ?= ../../kallpa
GIT = git

.PHONY: all test dependencias capas cruce dos-instancias medir reinicio clean

all: build/kallpa build/solo-espera build/transaccion

build/kallpa:
	mkdir -p build
	cp -r $(KALLPA) $@
	rm -f $@/data/*.db $@/data/*.db-*

build/solo-espera: solo-espera.diff
build/transaccion: transaccion.diff
build/solo-espera build/transaccion:
	rm -rf $@
	mkdir -p build
	cp -r $(KALLPA) $@
	rm -f $@/data/*.db $@/data/*.db-*
	cd $@ && $(GIT) apply ../../$(notdir $@).diff

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

dependencias:
	@for capa in http services store domain notifications; do \
		echo "== src/$$capa"; \
		grep -rhoE "from '\.\./[a-z]+/" $(KALLPA)/src/$$capa | sort | uniq -c; \
	done

# ESLint termina con error cuando encuentra algo: aquí eso es lo que se quiere ver.
capas: build/kallpa
	cp capas-eslint.js build/kallpa/capas-eslint.js
	cd build/kallpa && eslint -c capas-eslint.js . ; echo "eslint terminó con código $$?"

# El cambio de ejemplo que cruza capas: el make check de Kallpa pasa, la regla no.
cruce:
	rm -rf build/cruce
	mkdir -p build
	cp -r $(KALLPA) build/cruce
	rm -f build/cruce/data/*.db build/cruce/data/*.db-*
	cp capas-eslint.js build/cruce/capas-eslint.js
	cd build/cruce && $(GIT) apply ../../cruce-de-capas.diff
	$(MAKE) --no-print-directory -C build/cruce check 2>&1 | tail -8
	cd build/cruce && eslint -c capas-eslint.js . ; echo "eslint terminó con código $$?"

dos-instancias: build/kallpa
	cd build/kallpa && bash ../../dos-instancias.sh

medir: all
	@echo "Una instancia:"
	@node medir-escenario.ts build/kallpa 1
	@echo "Dos instancias, sobre la Kallpa publicada:"
	@node medir-escenario.ts build/kallpa 2
	@echo "Dos instancias, con solo-espera.diff:"
	@node medir-escenario.ts build/solo-espera 2
	@echo "Dos instancias, con transaccion.diff:"
	@node medir-escenario.ts build/transaccion 2

reinicio: build/kallpa
	@node medir-reinicio.ts build/kallpa

clean:
	rm -rf build
