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

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

dev: env
	env/bin/python3 dev.py

lint: env
	env/bin/flake8 moneyhub/ tests/ scripts/*.py dev.py application.py

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

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

type_check: env
	env/bin/mypy moneyhub

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

test_integration: dev_env
	env/bin/python3 tests/integration/utils/drop_fks.py
	env/bin/python3 -m pytest tests/integration -s \
		--cov-report xml \
		--junitxml=pyunit.xml

clean:
	rm -rf env .coverage .pytest_cache .cache coverage.xml pyunit.xml
	find . | grep -E '__pycache__|\.pyc|\.pyo$\' | xargs rm -rf

clean_docker:
	make docker_down
	docker system prune -f && docker volume prune -f
	make sync_docker
	make start_db
	make integration_stack

ci_unit_lint: ci_unit_lint_clean
	mkdir -p build
	chmod a+w build
	make docker_unit_lint

ci_unit_lint_clean: down_unit_lint
	rm -rf build

docker_unit_lint:
	docker compose up \
	--build \
	--exit-code-from lint-and-unit-test \
	--abort-on-container-exit \
	--remove-orphans \
	lint-and-unit-test

down_unit_lint:
	docker compose down --remove-orphans -v

integration_test_docker:
	docker compose up \
	    --build \
		--exit-code-from integration-test \
		--abort-on-container-exit \
		--remove-orphans \
		integration-test

script_runner_docker:
	docker compose up \
		--build \
		--exit-code-from script-runner \
		--abort-on-container-exit \
		--remove-orphans \
		script-runner

clean_test_integration:
	rm -rf tests/integration/env

generate_openapi:
	env/bin/python3 scripts/generate_openapi.py

integration_stack:
	docker compose up -d ows-moneyhub
	env/bin/python3 -m pip install -q -r requirements.txt -r requirements-dev.txt -i https://pypi.theorchard.io/pypi/ qa-testing-utils
	env/bin/patience --services http://localhost:6501/hello

dev_env: env
	if [ ! -f env/bin/py.test ]; then env/bin/python3 -m pip install -q -I -r requirements.txt -r requirements-dev.txt; fi

start_db:
	docker compose up \
	    --build \
		--exit-code-from moneyhub-liquibase-runner \
		--abort-on-container-exit \
		--remove-orphans \
		moneyhub-liquibase-runner

sync_docker_jenkins:
	aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 437795906767.dkr.ecr.us-east-1.amazonaws.com
	docker pull 437795906767.dkr.ecr.us-east-1.amazonaws.com/royalties-liquibase-runner:latest

	# Log in to the account where the ows-moneyhub image is stored
	aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 086679231553.dkr.ecr.us-east-1.amazonaws.com

docker_pull:
	docker pull 437795906767.dkr.ecr.us-east-1.amazonaws.com/royalties-liquibase-runner:latest

sync_docker:
	aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 086679231553.dkr.ecr.us-east-1.amazonaws.com
	aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 437795906767.dkr.ecr.us-east-1.amazonaws.com
	docker compose pull -q

docker_down:
	docker compose down --remove-orphans -v

jenkins_env: docker_down clean docker_pull

integration_job: jenkins_env start_db integration_test_docker

hooks:
	cp .pre-commit.shadow .git/hooks/pre-commit
	chmod +x .git/hooks/pre-commit
