.DEFAULT_GOAL = .help
.SILENT:;
.ONESHELL:;

SHELL := /bin/bash
.SHELLFLAGS := -eu -o pipefail -c

# @see: https://stackoverflow.com/questions/2214575/passing-arguments-to-make-run/14061796#14061796
CLI_ARGS := $(wordlist 2, $(words $(MAKECMDGOALS)), $(MAKECMDGOALS))
.PHONY: $(CLI_ARGS)

APP_NAME := MagasinetKBH
APP_VERSION := $(shell git symbolic-ref -q --short HEAD || git describe --tags --exact-match || git rev-parse --short HEAD)

DOCKER_BIN := docker
DOCKER_RUN_BIN := docker run --env-file docker-compose.env
DOCKER_COMPOSE_BIN := docker compose --file docker-compose.yml --env-file docker-compose.env
DOCKER_COMPOSE_WEB_SERVICE := web
DOCKER_COMPOSE_DATABASE_SERVICE := database
DOCKER_COMPOSE_REDIS_SERVICE := redis

%.env:
	cp $@.dist $@

.PHONY: image
image: docker-compose.env docker-compose.yml ## Start docker compose stack
	${DOCKER_COMPOSE_BIN} build \
		--progress plain \
		--pull \
		--no-cache

.PHONY: pull
pull: docker-compose.env docker-compose.yml ## Pull latest docker compose images
	${DOCKER_COMPOSE_BIN} pull \
		--ignore-buildable \
		--include-deps

.PHONY: ps
ps: docker-compose.yml ## Start docker compose stack
	${DOCKER_COMPOSE_BIN} ps \
		--all

.PHONY: up
up: docker-compose.env docker-compose.yml ## Start docker compose stack
	${DOCKER_COMPOSE_BIN} up \
		--detach \
		--remove-orphans

.PHONY: down
down: docker-compose.yml ## Stop docker compose stack
	${DOCKER_COMPOSE_BIN} down \
  		--remove-orphans \

.PHONY: logs
logs: up ## Print container logs
	${DOCKER_COMPOSE_BIN} logs \
		--follow \
  		--since 24h

.PHONY: bash
bash: up ## Shell into running `web` container
	${DOCKER_COMPOSE_BIN} exec \
 		$(DOCKER_COMPOSE_WEB_SERVICE) \
 			bash -- $(CLI_ARGS)

.PHONY: bash-database
bash-database: up ## Shell into running `database` container
	${DOCKER_COMPOSE_BIN} exec \
 		$(DOCKER_COMPOSE_DATABASE_SERVICE) \
 			bash -- $(CLI_ARGS)

.PHONY: bash-redis
bash-redis: up ## Shell into running `redis` container
	${DOCKER_COMPOSE_BIN} exec \
 		$(DOCKER_COMPOSE_DATABASE_SERVICE) \
 			bash -- $(CLI_ARGS)

.PHONY: npm
npm: up # Run arbitrary npm command
	${DOCKER_COMPOSE_BIN} exec \
 		$(DOCKER_COMPOSE_WEB_SERVICE) \
 			npm -- $(CLI_ARGS)

.PHONY: composer
composer: up # Run arbitrary npm command
	${DOCKER_COMPOSE_BIN} exec \
 		$(DOCKER_COMPOSE_WEB_SERVICE) \
 			composer --working-dir /var/www/sites/all/modules/custom/mkbh_composer -- $(CLI_ARGS)

.PHONY: .help
.help:
	printf "\n"
	printf "                \033[95m%s: v%s\033[0m\n" "$(APP_NAME)" $(APP_VERSION)
	printf "\n"
	printf "                %s: \033[90m%s\033[0m \033[94m%s \033[95m[%s]\033[0m\n" "Usage" "ENV_VARIABLE=ENV_VALUE" "make" "target"
	printf "\n"
	printf "                Available targets:"

	printf "\n                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"

	# Print all commands, which have '##' comments right of it's name.
  	# Commands gives from all Makefiles included in project.
  	# Sorted in alphabetical order.
	grep -hE '^[a-zA-Z. 0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
		awk 'BEGIN {FS = ":.*?## " }; {printf "\033[36m%+16s\033[0m: %s\n", $$1, $$2}'

	printf "                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
