.PHONY: all build build-docs build-ci build-ci-db pre-commit unittest help

all: build build-docs build-ci build-ci-db pre-commit unittest
default: help

help: ## Display this help
	@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n  make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf "  \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)

##@ Build
build: ## Build application image
	$(eval DOCKER_REGISTRY ?= 10.60.129.132:8890)
	$(eval DOCKER_IMAGE_TAG ?= ${DOCKER_REGISTRY}/cmp/backend:latest)
	docker build \
		-t ${DOCKER_IMAGE_TAG} \
		--label org.viettelcloud.cmp.service=cmp-backend \
		--build-arg DOCKER_REGISTRY=${DOCKER_REGISTRY} \
		.

build-docs: ## Build document image
	$(eval DOCKER_REGISTRY ?= 10.60.129.132:8890)
	$(eval DOCKER_IMAGE_TAG ?= ${DOCKER_REGISTRY}/cmp/backend-docs:latest)
	docker build \
		-f ./docs/Dockerfile \
		-t ${DOCKER_IMAGE_TAG} \
		--label org.viettelcloud.cmp.service=cmp-backend \
		--build-arg DOCKER_REGISTRY=${DOCKER_REGISTRY} \
		.

build-ci: ## Build CI image
	$(eval DOCKER_REGISTRY ?= 10.60.129.132:8890)
	$(eval DOCKER_IMAGE_TAG ?= ${DOCKER_REGISTRY}/cmp/backend-ci_master:latest)
	docker build \
		-f ./ci/Dockerfile \
		-t ${DOCKER_IMAGE_TAG} \
		--label org.viettelcloud.cmp.service=cmp-backend \
		--build-arg DOCKER_REGISTRY=${DOCKER_REGISTRY} \
		.

build-ci-db: ## Build cache DB image for unittest
	$(eval DOCKER_REGISTRY ?= 10.60.129.132:8890)
	$(eval CI_IMAGE_TAG ?= ${DOCKER_REGISTRY}/cmp/backend-ci_master:latest)
	$(eval DB_IMAGE_TAG ?= ${DOCKER_REGISTRY}/cmp/backend-postgres_master:13.6)
	$(eval IMAGE_PULL_STRATEGY ?= missing)
	$(eval \
		DB_CONTAINER_ID := $(shell docker run \
			-tid \
			--privileged \
			--pull=${IMAGE_PULL_STRATEGY} \
			--tmpfs=/pgtmpfs \
			-e PGDATA=/pgtmpfs \
			-e ENABLE_RAM_DB=true \
			-e RAM_DB_SIZE=1024m \
			-e POSTGRES_USER=cmp \
			-e POSTGRES_PASSWORD=cmp \
			-e POSTGRES_DB=test_cmp_backend \
			${DOCKER_REGISTRY}/cmp/postgres:13.6 \
			| tr -d '\n'))
	((docker run \
			--rm \
			--link ${DB_CONTAINER_ID}:db \
			--mount type=bind,src=$(CURDIR),dst=/app \
			-e DB_USER=cmp \
			-e DB_PASSWORD=cmp \
			-e DB_NAME=test_cmp_backend \
			-e DB_PORT=5432 \
			-e DB_HOST=db \
			-e DOTENV_FILE=/app/env.example \
			${CI_IMAGE_TAG} \
			/bin/bash -c "poetry install --with dev; cd backend; python manage.py migrate" && \
		docker exec ${DB_CONTAINER_ID} /bin/bash -c "pg_dumpall -U cmp > /test_cmp_backend_schemas.sql" && \
		docker commit -c "LABEL org.viettelcloud.cmp.service=cmp-backend" ${DB_CONTAINER_ID} ${DB_IMAGE_TAG}); \
	echo Removing database container ${DB_CONTAINER_ID}; \
	docker rm -f ${DB_CONTAINER_ID})

##@ Run
pre-commit: ## Run pre-commit checks
	$(eval CI_IMAGE_TAG ?= 10.60.129.132:8890/cmp/backend-ci_master:latest)
	$(eval CI_DIFF_CHECK_WITH ?= origin/master)
	$(eval IMAGE_PULL_STRATEGY ?= missing)
	docker run \
		--rm \
		--user $(shell id -u):$(shell id -g) \
		-v /etc/passwd:/etc/passwd \
		-v /etc/group:/etc/group \
		--pull=${IMAGE_PULL_STRATEGY} \
		--mount type=bind,src=$(CURDIR),dst=/app \
		${CI_IMAGE_TAG} \
		timeout 60 /bin/bash /app/ci/pre_commit.sh

unittest: ## Run unittests
	$(eval DB_IMAGE_TAG ?= 10.60.129.132:8890/cmp/backend-postgres_master:13.6)
	$(eval CI_IMAGE_TAG ?= 10.60.129.132:8890/cmp/backend-ci_master:latest)
	$(eval IMAGE_PULL_STRATEGY ?= always)
	$(eval CI_SONAR_EXCLUDE ?= "")
	$(eval CI_NUM_TEST_PROCESSES ?= 8)
	$(eval CI_ENABLE_COVERAGE_CHECK ?= 1)
	$(eval CI_COVERAGE_FILE ?= coverage.xml)
	$(eval CI_DIFF_COVERAGE_WITH ?= origin/master)
	$(eval CI_DIFF_COVERAGE_FILE ?= diff-coverage.json)
	@echo "> Running database container..."
	$(eval \
		DB_CONTAINER_ID := $(shell docker run \
			-tid \
			--privileged \
			--pull=${IMAGE_PULL_STRATEGY} \
			--tmpfs=/pgtmpfs \
			-e PGDATA=/pgtmpfs \
			-e ENABLE_RAM_DB=true \
			-e RAM_DB_SIZE=1024m \
			-e POSTGRES_USER=cmp \
			-e POSTGRES_PASSWORD=cmp \
			-e POSTGRES_DB=cmp_backend \
			${DB_IMAGE_TAG} \
			| tr -d '\n'))
	@trap "echo Removing database container ${DB_CONTAINER_ID}...; docker rm -f ${DB_CONTAINER_ID}" EXIT INT; \
	echo "> Waiting for database to be up and running..."; \
	docker exec ${DB_CONTAINER_ID} /bin/bash -c "while !(pg_isready); do sleep 3; done"; \
	echo "> Loading migration cache if presented..."; \
	docker exec ${DB_CONTAINER_ID} /bin/bash -c "[ -e /test_cmp_backend_schemas.sql ] && psql -qU cmp cmp_backend < /test_cmp_backend_schemas.sql > /dev/null"; \
	docker run \
		--rm \
		--user $(shell id -u):$(shell id -g) \
		-v /etc/passwd:/etc/passwd \
		-v /etc/group:/etc/group \
		--pull=${IMAGE_PULL_STRATEGY} \
		--link ${DB_CONTAINER_ID}:db \
		--mount type=bind,src=$(CURDIR),dst=/app \
		-e DB_USER=cmp \
		-e DB_PASSWORD=cmp \
		-e DB_NAME=cmp_backend \
		-e DB_HOST=db \
		-e DB_PORT=5432 \
		-e DOTENV_FILE=/app/env.example \
		-e CI_SONAR_EXCLUDE=${CI_SONAR_EXCLUDE} \
		-e CI_NUM_TEST_PROCESSES=${CI_NUM_TEST_PROCESSES} \
		-e CI_ENABLE_COVERAGE_CHECK=${CI_ENABLE_COVERAGE_CHECK} \
		-e CI_COVERAGE_FILE=${CI_COVERAGE_FILE} \
		-e CI_DIFF_COVERAGE_WITH=${CI_DIFF_COVERAGE_WITH} \
		-e CI_DIFF_COVERAGE_FILE=${CI_DIFF_COVERAGE_FILE} \
		${CI_IMAGE_TAG} \
		timeout 3600 /bin/bash /app/ci/unittest.sh

##@ Clean
clean: ## Clean dangling images
	@docker rmi $(docker image list --filter dangling=true --filter label=org.viettelcloud.cmp.service=cmp-backend)
