# Semana 5: complejidad, módulos profundos y conceptos. Se usa dentro del
# contenedor del curso.
#
#   make           copia Kallpa en build/kallpa, para medirla sin tocar la
#                  original
#   make test      revisa los tipos (tsc), corre ESLint, las pruebas
#                  (*.test.ts), que comprueban lo que dice el apunte, y el
#                  refactoring de ejemplo (make refactor)
#   make medir     los números del paso 1 del laboratorio, sobre build/kallpa
#   make capas     las dependencias entre las capas de Kallpa (layers.ts)
#   make refactor  aplica refactor-fecha.diff a una copia de Kallpa en
#                  build/refactor y corre su make check
#   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

.PHONY: all test medir capas refactor clean

all: build/kallpa

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

test:
	tsc -p .
	eslint .
	node --test "*.test.ts"
	$(MAKE) --no-print-directory refactor

medir: build/kallpa
	cd build/kallpa && wc -l src/http/handlers.ts src/services/*.ts
	cd build/kallpa && grep -n "from " src/http/handlers.ts

capas:
	node layers.ts $(KALLPA)/src

# Un refactoring pequeño: la validación de ?date= estaba copiada en dos
# handlers. Las pruebas de Kallpa no cambian y tienen que seguir pasando.
refactor:
	rm -rf build/refactor
	mkdir -p build
	cp -r $(KALLPA) build/refactor
	rm -f build/refactor/data/*.db build/refactor/data/*.db-*
	cd build/refactor && $(GIT) init -q && $(GIT) add -A && $(GIT) commit -qm "Kallpa publicada"
	cd build/refactor && $(GIT) apply ../../refactor-fecha.diff
	cd build/refactor && $(GIT) diff --stat
	$(MAKE) --no-print-directory -C build/refactor check
	cd build/refactor && test -z "$$($(GIT) status --porcelain -- test)" && echo "test/ sin cambios"

clean:
	rm -rf build
