APP=workflowdb-schema
REGISTRY ?= 475275892927.dkr.ecr.us-east-1.amazonaws.com/delphi/$(APP)
REVISION ?= $(shell git rev-parse --short=8 HEAD)
VERSION ?= $(shell cat ./VERSION)
BUILDTIME = $(shell date -u +"%Y%m%d%H%M%S")
VERSION_REVISION ?= ${VERSION}-${REVISION}
BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD)

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

DDL_FILENAME ?= "`date -u +%Y%m%d_%H%M%S`_$(BRANCH)_$(MSG).sql"
DDL_FILEPATH ?= migrations/$(DDL_FILENAME)

PG_VERSION=13.5

## -
## 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}:latest \
		-t ${REGISTRY}:${VERSION_REVISION} .

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

##    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 \
		-e POSTGRES_USER=admin \
		-e POSTGRES_PASSWORD=admin \
		-e POSTGRES_DB=workflowdb \
		-p 0.0.0.0:5643:5432 \
		--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/workflowdb \
		-e LIQUIBASE_USERNAME=admin \
		-e LIQUIBASE_PASSWORD=admin \
		-e LIQUIBASE_CHANGELOG=/liquibase/db.changelog-master.xml \
		${REGISTRY}:${VERSION} update

##    docker/pg/rollback
.PHONY: docker/pg/rollback
docker/pg/rollback:
	docker run --rm --network ${NETWORK} \
		-e CREATE_USERS=1 \
		-e LIQUIBASE_URL=jdbc:postgresql://${PG_CONTAINER_NAME}:5432/workflowdb \
		-e LIQUIBASE_USERNAME=admin \
		-e LIQUIBASE_PASSWORD=admin \
		-e LIQUIBASE_CHANGELOG=/liquibase/db.changelog-master.xml \
		${REGISTRY}:${VERSION} rollbackCount $(shell ls -1 ./migrations | wc -l)

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



##    migration/clean - soft cleanup of a migration folder from untracked files. Everything will be moved to `.trash` folder
.PHONY: migration/clean
migration/clean:
	@echo "Cleanup \"migrations/\" folder from untracked files"
	-@mkdir -p .trash
	@git ls-files --others --exclude-standard | grep migrations | xargs -I {} mv {} .trash/

##    migration/name MSG="short description" - name for the new migration
.PHONY: migration/name
migration/name:
	@echo $(DDL_FILENAME)

##    migration/add MSG="short description" - add an empty file for migration
.PHONY: migration/add
migration/add:
	@touch $(DDL_FILEPATH)
	@echo "--liquibase formatted sql" >> $(DDL_FILEPATH)
	@echo "--changeset `git config user.email`:$(BRANCH)" >> $(DDL_FILEPATH)
	@echo "migration file: $(DDL_FILEPATH)"

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