BUILD_NUMBER  ?= 1

PROJECT       ?= core-images
PROJECT_GROUP ?= core

BASE_AWS_PROFILE    = gdb-infra-dev
BASE_AWS_ACCOUNT_ID = 483193324480
BASE_AWS_REGION     = us-east-1
BASE_ECR_REGISTRY   = $(BASE_AWS_ACCOUNT_ID).dkr.ecr.$(BASE_AWS_REGION).amazonaws.com

AWS_PROFILE    ?= gdb-core-dev
AWS_ACCOUNT_ID ?= 582412345909
AWS_REGION     ?= us-east-1

ECR_REGISTRY        ?= ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com
ECR_REPOSITORY_NAME ?= ${PROJECT_GROUP}/${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 )

## -
## 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/^/ /'

## -
## Local commands:

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

##   venv - create, activate venv and install dependencies
.PHONY:venv
venv:
	@virtualenv --python=python3 venv
	@. venv/bin/activate && pip install -r requirements.txt

## -
## Version management

##   version/patch - increment version patch
.PHONY: version/patch
version/patch: ## increment version
	@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 or podman, 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}

##   docker/login - login to AWS ECR registry using docker or podman, for aws cli version 2, aws configuration need to be set first
.PHONY:docker/login_v2
docker/login_v2:
	@aws ecr get-login-password \
		--profile ${AWS_PROFILE} \
		--region ${AWS_REGION} | \
		docker login --username AWS --password-stdin ${ECR_REGISTRY}

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

##   docker/image/build - build docker image
.PHONY: docker/image/build
docker/image/build: docker/login/base
	@docker pull ${ECR_REGISTRY_URI}:develop || exit 0
	@docker build \
		--cache-from ${ECR_REGISTRY_URI}:develop \
		--build-arg VERSION \
		-t ${ECR_REGISTRY_URI}:${VERSION} \
		.
	@docker inspect ${ECR_REGISTRY_URI}:${VERSION}

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

## run docker container
.PHONY: docker/run
docker/run:
	@echo "Run app in a docker image"
	docker-compose up -d --build

##   docker/makemigrations - create db migrations with docker-compose
.PHONY: docker/makemigrations
docker/makemigrations:
	@echo "Create db migrations"
	docker-compose build && docker-compose run --rm app sh -c "python manage.py makemigrations"

##   docker/migrate - run db migrations with docker-compose
.PHONY: docker/migrate
docker/migrate:
	@echo "Run db migrations"
	docker-compose build && docker-compose run --rm app sh -c "python manage.py migrate"

##   docker/test - run tests with docker-compose
.PHONY:docker/test
docker/test:
	@echo "Run unit tests in a docker image"
	docker-compose -f docker-compose.test.yml up --build --abort-on-container-exit test

##   docker/lint - run flake8
.PHONY:docker/lint
docker/lint:
	@echo "Run flake8 in a docker image"
	docker-compose -f docker-compose.test.yml build && docker-compose -f docker-compose.test.yml run --rm test sh -c "flake8 ."

##   docker/dependencies-check - run pip-audit check with docker-compose
.PHONY:docker/dependencies-check
docker/dependencies-check:
	@echo "Run pip-audit in a docker image"
	 touch .env && docker-compose -f docker-compose.test.yml build && docker-compose -f docker-compose.test.yml run --rm test sh -c "pip-audit --cache-dir /tmp --ignore-vuln GHSA-hcpj-qp55-gfph" # ignored GitPython

##   docker/bandit - run Bandit check with docker-compose
.PHONY:docker/bandit
docker/bandit:
	@echo "Run Safety in a docker image"
	docker-compose -f docker-compose.test.yml build && docker-compose -f docker-compose.test.yml run --rm test sh -c "bandit -r core_images/"

##   docker/clean - stop containers and clean up docker
.PHONY:docker/clean
docker/clean:
	docker-compose -f docker-compose.test.yml down
