.PHONY: dev pip_dev lint test test_unit test_integration pip_test_integration clean clean_test_integration

dev: env dev.py
	env/bin/python3.13 dev.py

env pip_dev: requirements.txt requirements-dev.txt
	python3.13 -m venv env
	env/bin/pip3.13 install --upgrade pip
	env/bin/pip3.13 install -r requirements.txt
	env/bin/pip3.13 install -r requirements-dev.txt

lint: env notifications tests/ dev.py
	env/bin/flake8 notifications/ tests/ dev.py

test: env tests/unit/
	env/bin/py.test tests/unit/

test_unit: env notifications tests/unit/
	env/bin/py.test \
		--cov notifications tests/unit/ \
		--cov-report xml \
		--junitxml=pyunit.xml

test_integration: tests/integration/env tests/integration
	tests/integration/env/bin/py.test tests/integration

tests/integration/env pip_test_integration: tests/integration/requirements.txt
	python3.13 -m venv tests/integration/env
	tests/integration/env/bin/pip3.13 install --upgrade pip
	tests/integration/env/bin/pip3.13 install -r tests/integration/requirements.txt

clean:
	rm -rf env

clean_test_integration:
	rm -rf tests/integration/env

down:  # Bring down all docker containers
	docker compose down

docker_unit_lint:  # Run lint and unit tests in Docker
	docker compose up \
		--build \
		--exit-code-from unit-lint \
		--abort-on-container-exit \
		--remove-orphans \
		unit-lint

down_unit_lint:  # Teardown any remaining Docker containers related to lint and unit tests
	docker compose down unit-lint --remove-orphans

ci_unit_lint: ci_unit_lint_clean  # Run lint and unit tests in CI/CD
	mkdir -p build
	chmod a+w build
	make docker_unit_lint

ci_unit_lint_clean: down_unit_lint  # Teardown lint and unit tests in CI/CD
	rm -rf build

up_deploy:  # Bring up dockerized deploy service
	docker compose build \
		--no-cache \
		bff-notifications-deploy
	docker compose up \
		--detach \
		--remove-orphans \
		bff-notifications-deploy

down_deploy:  # Bring down all docker containers associated with running the deploy service
	docker compose down bff-notifications-deploy

docker_integration_test:  # Run integration tests in Docker
	docker compose up \
		--build \
		--exit-code-from integration-test \
		--abort-on-container-exit \
		--remove-orphans \
		integration-test

down_integration: down  # Teardown any remaining Docker containers related to integration tests

ci_test_integration: ci_test_integration_clean  # Run integration tests in CI/CD
	make docker_integration_test

ci_test_integration_clean: down_integration  # Teardown integration tests in CI/CD
