APP=$(shell basename $(CURDIR))
PACKAGE=$(subst _,-,$(APP))
STAGE?=dev
VENV_NAME ?= venv
PIP = $(VENV_NAME)/bin/pip3
GEN = $(VENV_NAME)/bin/gen

# Set AWS ECR address if your tools is going to be executed in a cloud
REGISTRY ?= 475275892927.dkr.ecr.us-east-1.amazonaws.com/delphi/kong
REVISION ?= $(shell git rev-parse --short=8 HEAD)
VERSION ?= $(shell git rev-parse --abbrev-ref HEAD)
BUILDTIME = $(shell date -u +"%Y%m%d%H%M%S")

.DEFAULT_GOAL := help

DOCKER_VENV_NAME ?= dockerenv
TEST_IMAGE = 475275892927.dkr.ecr.us-east-1.amazonaws.com/python-testing:0.0.1

ROOT_PATH =  $(shell pwd)
CONFIGS_PATH = $(ROOT_PATH)/configs
DOCKER_CONFIGS_PATH = /configs
FILES_PATH = $(ROOT_PATH)/files
DOCKER_FILES_PATH = /files

## -
## Local commands:

## -
## Docker commands:

##   docker/login - login to AWS docker, aws configuration need to be set first
.PHONY: docker/login
docker/login:
	@echo "Docker login"
	$$(aws ecr get-login --no-include-email --region us-east-1)

##   docker/image/build - build lambda package for each environment and put all of them into one docker container
.PHONY: docker/build
docker/build: docker/login
	@echo "Building docker image"
	docker build \
	    --no-cache \
		--build-arg REVISION=$(REVISION) \
		--build-arg BUILDTIME=$(BUILDTIME) \
		-t $(REGISTRY):$(VERSION) \
		-t $(REGISTRY):$(REVISION) .

##   docker/image/push - push an image to a registry
.PHONY: docker/push
docker/push: docker/login
	@echo "Pushing docker image"
	docker push $(REGISTRY):$(VERSION)
	docker push $(REGISTRY):$(REVISION)

.PHONY: docker/run
docker/run:
	@echo "Kong starting..."
	docker run \
		-e KONG_DECLARATIVE_CONFIG=/usr/local/kong/declarative/configs/dev/kong.yml \
		--rm \
		-p 8000:8000 \
		-p 8443:8443 \
		-p 8001:8001 \
		$(REGISTRY):$(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/^/ /'


$(VENV_NAME)/bin/activate:
	python3.7 -m venv $(VENV_NAME)

$(VENV_NAME): $(VENV_NAME)/bin/activate
	@echo "Creating virtial environment"
	@cp pip.conf $(VENV_NAME)/
	$(PIP) install -U 'pip<22'
	$(PIP) install -r requirements.txt


##   gen/<dev|qa|stage|prod> - generate configs for a given environment
.PHONY:gen/%
gen/%: $(VENV_NAME)
	$(GEN) --yaml-dir-path $(FILES_PATH) --config-dir-path $(CONFIGS_PATH)/$* --environment $* --config-name all

##   gen/all - generate configs for all environments
.PHONY:gen/all
gen/all: $(VENV_NAME)
	@make gen/dev
	@make gen/qa
	@make gen/stage
	@make gen/prod

##   docker/<local target> - universal docker wrapper for local targets
docker/%: docker/login
	docker run --rm \
		-v /app/$(DOCKER_VENV_NAME) \
		-v $(PWD)/:/$(APP)/ \
		-v $(FILES_PATH):$(DOCKER_FILES_PATH) \
		-v $(CONFIGS_PATH):$(DOCKER_CONFIGS_PATH) \
		-w /$(APP)/ \
		-e STAGE=$(STAGE) \
		${TEST_IMAGE} make VENV_NAME=$(DOCKER_VENV_NAME) \
		CONFIGS_PATH=$(DOCKER_CONFIGS_PATH) FILES_PATH=$(DOCKER_FILES_PATH) $*