# This makefile is used for the actual db deployment (last stage in ../Jenkinsfile)
APP=$(shell basename $(CURDIR))
REGISTRY = 475275892927.dkr.ecr.us-east-1.amazonaws.com/delphi/main-db-schema
REVISION ?= $(shell git rev-parse --short=8 HEAD)
VERSION ?= $(shell cat ./VERSION)
BUILDTIME = $(shell date -u +"%Y%m%d%H%M%S")
BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD)

TEST_ID = $(subst .,_,${VERSION})
PG_CONTAINER_NAME = PG__${TEST_ID}
NETWORK = DB_SCHEMA_NETWORK__${TEST_ID}

PG_VERSION=13.5
AWS_PROFILE=gdb-delphi-dev

## -
## Commands:

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

##    docker/image/build - put DDL scripts inside of a Liquibase image
.PHONY: docker/image/build
docker/image/build:
	docker build \
	    --no-cache \
		--build-arg REVISION=${REVISION} \
		--build-arg BUILDTIME=${BUILDTIME} \
		-t ${REGISTRY}:${VERSION} \
		-t ${REGISTRY}:${BRANCH} \
		-t ${REGISTRY}:${REVISION} .

##    docker/test_image/build - create an image for integration tests
.PHONY: docker/test_image/build
docker/test_image/build: docker/login
	docker build \
	    --no-cache \
		--build-arg REVISION=${REVISION} \
		--build-arg BUILDTIME=${BUILDTIME} \
		-t delphi-api-integration-tests:${VERSION} \
		-t delphi-api-integration-tests:${BRANCH} \
		-t delphi-api-integration-tests:${REVISION} tests

##    docker/image/push - push image into ECR
.PHONY: docker/image/push
docker/image/push: docker/login
	docker push ${REGISTRY}:${VERSION}

##    docker/clean - cleanup docker test environment
.PHONY: docker/clean
docker/clean:
	-docker kill ${PG_CONTAINER_NAME}
	-docker rm ${PG_CONTAINER_NAME}
	-docker network rm ${NETWORK}

##    docker/pg/start
.PHONY: docker/pg/start
docker/pg/start:
	docker run -d \
		-p 0.0.0.0:5678:5432 \
		-e POSTGRES_USER=postgres \
		-e POSTGRES_PASSWORD=postgres \
		-e POSTGRES_DB=test_db \
		-v $(PWD)/volume/data:/usr/data \
		-v $(PWD)/tests/init_test_db_sql/:/docker-entrypoint-initdb.d \
		--name=${PG_CONTAINER_NAME} postgres:${PG_VERSION}
	docker exec ${PG_CONTAINER_NAME} sh -c 'until pg_isready -U postgres; do sleep 1; done'
	docker network create ${NETWORK}
	docker network connect ${NETWORK} ${PG_CONTAINER_NAME}

##    docker/pg/migrate
.PHONY: docker/pg/migrate
docker/pg/migrate:
	docker run --rm --network ${NETWORK} \
		-e CREATE_USERS=1 \
		-e LIQUIBASE_URL=jdbc:postgresql://${PG_CONTAINER_NAME}:5432/test_db?createDatabaseIfNotExist=true \
		-e LIQUIBASE_USERNAME=postgres \
		-e LIQUIBASE_PASSWORD=postgres \
		-e LIQUIBASE_CHANGELOG=/liquibase/db.changelog-master.xml \
		${REGISTRY}:${VERSION} update

##    docker/pg/test
.PHONY: docker/pg/test
docker/pg/test:
	docker run --rm --network ${NETWORK} \
	    -e PG_HOST=${PG_CONTAINER_NAME} \
	    -e PG_NAME=test_db \
	    -e PG_USER=postgres \
	    -e PG_PASSWORD=postgres \
		delphi-api-integration-tests:${VERSION} /app/.local/bin/pytest /app/tests

##    docker/test - apply DDL scripts on Postgres
.PHONY: docker/test
docker/test: docker/image/build docker/clean
#docker/test: docker/image/build docker/test_image/build docker/clean
	$(MAKE) docker/pg/start
	$(MAKE) docker/pg/migrate
#	$(MAKE) docker/pg/test
	$(MAKE) docker/clean

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