.PHONY: build-openapi-spec serve-openapi-spec

build-swagger-container:
	docker build spec/swagger -t swagger-cli

build-openapi-spec: build-swagger-container
	# Build concatenated OpenAPI spec
	docker run --rm -v ${PWD}/spec:/local swagger-cli bundle local/openapi.yaml --outfile local/concatenated_openapi.yaml --type yaml --dereference
	# Lint concatenated OpenAPI spec
	docker run --rm --name mantik-api-openapi-lint -v $(shell pwd):/tmp stoplight/spectral lint --ruleset "/tmp/spec/.spectral.yaml" -D "/tmp/spec/openapi.yaml"

serve-openapi-spec: build-openapi-spec
	docker run --rm -p 8080:8080 -e SWAGGER_JSON=/tmp/concatenated_openapi.yaml -v ${PWD}/spec:/tmp swaggerapi/swagger-ui

generate-fastapi-code: build-swagger-container delete-generated-code
	mkdir spec/fast-api

	echo "For some reason the environments and run-schedules paths have to be commented or the autogenerations does not work"

	# If you need to generate code from the spec, leave out the `--dereference` flag.
	docker run --rm -v ${PWD}/spec:/local swagger-cli bundle local/openapi.yaml --outfile local/concatenated_openapi.yaml --type yaml
	docker run --rm -v ${PWD}/spec:/local openapitools/openapi-generator-cli generate -i /local/concatenated_openapi.yaml -g python-fastapi -o /local/fast-api/

	# Re-build with --dereference to be conform with usual build and
	# avoid committing of undesired changes
	$(MAKE) build-openapi-spec

delete-generated-code:
	sudo rm -rf spec/fast-api

build:
	docker compose -f docker/docker-compose.yml build --no-cache

up: stop build
	docker compose -f docker/docker-compose.yml up -d --remove-orphans

stop:
	docker compose -f docker/docker-compose.yml stop
	docker compose -f docker/docker-compose.yml rm -f

up-db: stop-db
	docker compose -f docker/docker-compose.yml up -d --remove-orphans db

stop-db:
	docker compose -f docker/docker-compose.yml stop db
	docker compose -f docker/docker-compose.yml rm -f db

up-integration: up-db
	docker compose -f docker/docker-compose.yml up -d --remove-orphans tracking-server tracking-server-db unicore

stop-integration: stop-db
	docker compose -f docker/docker-compose.yml stop tracking-server tracking-server-db unicore
	docker compose -f docker/docker-compose.yml rm -f tracking-server tracking-server-db unicore

re-build-run-db: stop-db build up-db

create-migrations: stop-db up-db
	# bring it up to date
	poetry run alembic upgrade head

	# generate migration based on current SQLAlchemy models
	poetry run alembic revision --autogenerate -m "$(shell git branch --show-current)"

	# apply newest migration to local database (if desired)
	poetry run alembic upgrade head

	$(MAKE) stop-db

run-migrations: stop-db up-db
	poetry run alembic upgrade head

test-spec: build-openapi-spec run-migrations
	. spec/schemathesis/run.sh --junit-xml=report.xml

test-unit:
	poetry run pytest src/tests/unit $(args)

test-integration: up-integration
	poetry run pytest -n auto src/tests/integration $(args)

test: up-integration
	poetry run pytest -n auto src/tests/integration src/tests/unit $(args)

change-stable-api-version:
	poetry run python3 scripts/change_spec_version.py --version $(version)
	$(MAKE) build-openapi-spec

test-data-migrations: stop-db up-db
	echo "Migrations will start from b78c1e1e8d3a, if you want to insert to a table that was not present before this version it will fail"
	poetry run alembic upgrade b78c1e1e8d3a
	poetry run python3 scripts/populate_database.py
	poetry run alembic upgrade head
	$(MAKE) stop-db