BUILD_NUMBER?=1
PROJECT?="api"
REPOSITORY?="apollo-${PROJECT}"
TAG?=develop
ECR?=475275892927.dkr.ecr.us-east-1.amazonaws.com

.PHONY:venv
venv:
	virtualenv --python=python3.8 venv
	. venv/bin/activate; pip install -r requirements/base.txt -r requirements/dev.txt -r requirements/tests.txt

.PHONY:docker/build-local
docker/build-local:
	docker-compose -f docker-compose.yml build

.PHONY:docker/up-local
docker/up-local: docker/build-local
	docker-compose -f docker-compose.yml up

.PHONY:docker/clean
docker/clean:
	docker images -q | xargs docker rmi && docker system prune --volumes

.PHONY:python/clean
python/clean:
	py3clean .

.PHONY:docker/build
docker/build:
	@docker build -t ${REPOSITORY}:${TAG}-${BUILD_NUMBER} -t ${ECR}/${REPOSITORY}:${TAG} .
	@IMAGE_WITH_TAG=${REPOSITORY}:${TAG}-${BUILD_NUMBER} docker-compose -f docker-compose.test.yml build

.PHONY:docker/login
docker/login:
	@aws ecr get-login --no-include-email | awk '{print $$6}' | docker login -u AWS --password-stdin https://${ECR}

.PHONY:docker/push
docker/push: docker/login
	@docker push ${ECR}/${REPOSITORY}:${TAG}

.PHONY:docker-compose/down
docker-compose/down:
	@IMAGE_WITH_TAG=${REPOSITORY}:${TAG}-${BUILD_NUMBER} docker-compose -f docker-compose.test.yml down

.PHONY:test
test: docker/build
	@IMAGE_WITH_TAG=${REPOSITORY}:${TAG}-${BUILD_NUMBER} docker-compose -f docker-compose.test.yml up -d mysql redis; sleep 10
	@IMAGE_WITH_TAG=${REPOSITORY}:${TAG}-${BUILD_NUMBER} docker-compose -f docker-compose.test.yml run api pytest -vv --junitxml report.xml --cov-report xml --cov=src src/

.PHONY:checkstyle
checkstyle: docker/build
	@IMAGE_WITH_TAG=${REPOSITORY}:${TAG}-${BUILD_NUMBER} docker-compose -f docker-compose.test.yml run api sh make/codestyle.sh

.PHONY:dependencies-check
dependencies-check: docker/build
	@IMAGE_WITH_TAG=${REPOSITORY}:${TAG}-${BUILD_NUMBER} docker-compose -f docker-compose.test.yml run api safety check

.PHONY:owasp
owasp: docker/build
	@IMAGE_WITH_TAG=${REPOSITORY}:${TAG}-${BUILD_NUMBER} docker-compose -f docker-compose.test.yml run api bandit -x **/tests/* -r /app/src

.PHONY:static-typing
static-typing: docker/build
	@IMAGE_WITH_TAG=${REPOSITORY}:${TAG}-${BUILD_NUMBER} docker-compose -f docker-compose.test.yml run api mypy /app/src

.PHONY:security
security: dependencies-check owasp

.PHONY:prettify
prettify: docker/build
	@IMAGE_WITH_TAG=${REPOSITORY}:${TAG}-${BUILD_NUMBER} docker-compose -f docker-compose.test.yml run api black /app/src --exclude='/(\.eggs|\.git|\.hg|\.mypy_cache|\.nox|\.tox|\.venv|venv|_build|buck-out|build|dist|migrations|.pytest_cache)/' --line-length=120 --target-version=py37
	@IMAGE_WITH_TAG=${REPOSITORY}:${TAG}-${BUILD_NUMBER} docker-compose -f docker-compose.test.yml run api isort -rc -w 120 /app/src

.PHONY:pre-commit
pre-commit: prettify checkstyle security test #static-typing
	docker-compose/down
