# Semana 6: APIs y patrones de diseño. Se usa dentro del contenedor del curso.
#
#   make            copia Kallpa en build/kallpa y empaqueta openapi.yaml como
#                   JSON en build/openapi.json
#   make test       revisa los tipos (tsc), corre ESLint, redocly lint sobre
#                   el esqueleto, las pruebas (*.test.ts), que comprueban lo
#                   que dice el apunte, y los dos cambios de ejemplo sobre
#                   copias de Kallpa (make decorator y make v2)
#   make recorrido  levanta una copia de Kallpa, reserva, reintenta y cancela
#                   dos veces con curl (el paso 2 del laboratorio)
#   make retry      la respuesta perdida, con reintento: en Kallpa y en un
#                   servidor de pagos con y sin clave de idempotencia
#   make decorator  aplica decorator-server.diff a una copia de Kallpa y corre
#                   su make check
#   make v2         aplica v2-bookings.diff a una copia de Kallpa y corre su
#                   make check
#   make recorrido-v2  las dos versiones de make v2, con curl
#   make docs       genera build/api.html con redocly build-docs
#   make clean      borra build/
#
# El esqueleto del laboratorio es openapi.yaml. 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 recorrido recorrido-v2 retry decorator v2 docs clean

all: build/kallpa/package.json build/openapi.json

build/kallpa/package.json: $(wildcard $(KALLPA)/src/*.ts $(KALLPA)/src/*/*.ts $(KALLPA)/test/*.ts $(KALLPA)/*.json $(KALLPA)/*.js $(KALLPA)/Makefile)
	rm -rf build/kallpa
	mkdir -p build
	cp -r $(KALLPA) build/kallpa
	rm -rf build/kallpa/data build/kallpa/node_modules
	mkdir -p build/kallpa/data

build/openapi.json: openapi.yaml
	mkdir -p build
	redocly bundle openapi.yaml --ext json -o build/openapi.json

test: all
	tsc -p .
	eslint .
	redocly lint openapi.yaml
	node --test "*.test.ts"
	$(MAKE) --no-print-directory decorator
	$(MAKE) --no-print-directory v2
	@if [ -f solution/openapi.yaml ]; then \
		redocly lint solution/openapi.yaml --format=summary; \
		redocly bundle solution/openapi.yaml --ext json -o build/solution-openapi.json; \
		node --test "solution/*.test.ts"; \
	else \
		echo "(sin solution/: la especificación completa se publica al final del laboratorio)"; \
	fi

recorrido: all
	bash recorrido.sh

retry: all
	node retry-demo.ts

# Un cambio de estructura: el try/catch/finally de server.ts pasa a dos
# decorators. Las pruebas de Kallpa no cambian y tienen que seguir pasando.
decorator: all
	rm -rf build/decorator
	cp -r build/kallpa build/decorator
	cd build/decorator && $(GIT) init -q && $(GIT) add -A && $(GIT) commit -qm "Kallpa publicada"
	cd build/decorator && $(GIT) apply ../../decorator-server.diff
	cd build/decorator && $(GIT) diff --stat
	$(MAKE) --no-print-directory -C build/decorator check
	cd build/decorator && test -z "$$($(GIT) status --porcelain -- test)" && echo "test/ sin cambios"

# Un cambio compatible: la ruta nueva convive con la vieja, que se anuncia con
# Deprecation y Sunset. Las pruebas viejas siguen igual; se agrega test/v2.test.ts.
v2: all
	rm -rf build/v2
	cp -r build/kallpa build/v2
	cd build/v2 && $(GIT) init -q && $(GIT) add -A && $(GIT) commit -qm "Kallpa publicada"
	cd build/v2 && $(GIT) apply ../../v2-bookings.diff
	cd build/v2 && $(GIT) add -A && $(GIT) diff --cached --stat
	$(MAKE) --no-print-directory -C build/v2 check

recorrido-v2: v2
	bash recorrido-v2.sh

docs: all
	redocly build-docs openapi.yaml -o build/api.html

clean:
	rm -rf build
