BUILD_NUMBER  ?= 1

PROJECT       ?= apple-top-playlists-aggregation
PROJECT_GROUP ?= apollo

AWS_PROFILE    ?= gdb-apollo-dev
AWS_ACCOUNT_ID ?= 725764004555
AWS_REGION     ?= us-east-1

ECR_REGISTRY        ?= $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com
ECR_REPOSITORY_NAME ?= $(PROJECT_GROUP)/lambda/$(PROJECT)
ECR_REGISTRY_URI    ?= $(ECR_REGISTRY)/$(ECR_REPOSITORY_NAME)

REVISION  ?= $(shell git rev-parse --short=8 HEAD)
BUILDTIME ?= $(shell date -u +"%Y%m%d%H%M%S")
VERSION   ?= "build-$(BUILDTIME).$(REVISION)"
SEMVER    ?= $(shell cat VERSION )

## -
## Local commands:

##   local/init - install bumpversion
.PHONY: local/init
local/init:
	@pip install --upgrade bumpversion

##   venv - create, activate venv and install dependencies
.PHONY:venv
venv:
	@python3 -m venv venv
	@. venv/bin/activate && pip install -r requirements/dev.pip

##   docker/local/build - build project locally using docker-compose
.PHONY:docker/local/build
docker/local/build:
	@docker-compose -f docker-compose.yml build

##   docker/local/up - run project locally using docker-compose
.PHONY:docker/local/up
docker/local/up: docker/local/build
	@docker-compose -f docker-compose.yml up

.PHONY:docker/test/build
docker/test/build:
	@docker-compose -f docker-compose.test.yml build

##   docker/local/clean - clean up docker images and docker volumes
.PHONY:docker/local/clean
docker/local/clean:
	@docker images -q | xargs docker rmi && docker system prune --volumes

##   python/clean - removes .pyc and .pyo files
.PHONY:python/clean
python/clean:
	@py3clean .

## -
## Version management

##   version/patch - increment version patch
.PHONY: version/patch
version/patch:
	@bumpversion \
		--config-file .bumpversion.cfg \
		--current-version $(SEMVER) \
		patch VERSION --allow-dirty

##   version/minor - increment version minor
.PHONY: version/minor
version/minor:
	@bumpversion \
		--config-file .bumpversion.cfg \
		--current-version $(SEMVER) \
		minor VERSION --allow-dirty

##   version/major - increment version major
.PHONY: version/major
version/major:
	@bumpversion \
		--config-file .bumpversion.cfg \
		--current-version $(SEMVER) \
		major VERSION --allow-dirty

## -
## Docker commands:

##   docker/login - login to AWS ECR registry using docker, aws configuration need to be set first
.PHONY:docker/login
docker/login:
	@aws ecr get-login \
		--profile ${AWS_PROFILE} \
		--no-include-email \
		--region ${AWS_REGION} | awk '{print $$6}' | \
		docker login -u AWS --password-stdin https://$(ECR_REGISTRY) || aws ecr get-login-password \
			--profile ${AWS_PROFILE} \
			--region ${AWS_REGION} | \
			docker login --username AWS --password-stdin https://$(ECR_REGISTRY)

##   podman/image/build - build docker image
.PHONY: docker/image/build
docker/image/build:
	@docker build \
		--build-arg VERSION \
		-t $(ECR_REGISTRY_URI):$(VERSION) \
		--target main \
		.

##   docker/image/push - push an image to a registry
.PHONY: docker/image/push
docker/image/push:
	@docker push $(ECR_REGISTRY_URI):$(VERSION)

##   test - run unit tests
.PHONY:test
test:
	@docker-compose -f docker-compose.test.yml run lambda pytest -vv --junitxml report.xml --cov-report xml --cov=apple_top_playlists_aggregation ./

##   docker-compose/down - shutdown docker-compose
.PHONY:docker-compose/down
docker-compose/down:
	@docker-compose -f docker-compose.test.yml down

##   test - run checkstyle
.PHONY:checkstyle
checkstyle:
	@docker-compose -f docker-compose.test.yml run lambda flake8 /var/task/apple_top_playlists_aggregation/ --max-line-length=120 --max-complexity=15 --ignore=E203

##   dependencies-check - run dependencies check
.PHONY:dependencies-check
dependencies-check:
	@docker-compose -f docker-compose.test.yml run lambda safety check

##   owasp - run owasp check
.PHONY:owasp
owasp:
	@docker-compose -f docker-compose.test.yml run lambda bandit -x /var/task/tests -r /var/task/apple_top_playlists_aggregation

##   static-typing - check static-typing
.PHONY:static-typing
static-typing:
	@docker-compose -f docker-compose.test.yml run lambda mypy -p apple_top_playlists_aggregation

##   security - run security check
.PHONY:security
security: dependencies-check owasp

##   prettify - run prettify
.PHONY:prettify
prettify:
	@docker-compose -f docker-compose.test.yml run lambda black /var/task/apple_top_playlists_aggregation --exclude='/(\.eggs|\.git|\.hg|\.mypy_cache|\.nox|\.tox|\.venv|venv|_build|buck-out|build|dist|migrations|.pytest_cache)/' --line-length=120 --target-version=py38
	@docker-compose -f docker-compose.test.yml run lambda isort -rc -w 120 /var/task/apple_top_playlists_aggregation

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

## -
## help - this message
.PHONY: help
help: Makefile
	@echo "Application: $(APP)\n"
	@echo "Run command:\n  make <target>\n"
	@grep -E -h '^## .*' $(MAKEFILE_LIST) | sed -n 's/^##//p'  | column -t -s '-' |  sed -e 's/^/ /'
