PARAM = $(PWD)/conf/parameters.env
NOW = $(shell date +%Y%m%d"-"%H%M%S)

$(shell ! test -e $(PARAM) && cp ./conf/parameters.dist.env ./conf/parameters.env)

ifneq (,$(wildcard $(PARAM)))
	include $(PARAM)
endif

VAR_LIST = ENV CLIENT SRVNAME CACHE
__check_defined = $( \
	$(if $(value $1) \
	,\
	,$(error Variable '$1' est non définie ou vide))\
)
$(foreach v, \
	$(VAR_LIST), \
	$(call __check_defined,$v) \
)

DOCKERCOMPOSE = $(shell command -v docker-compose 2> /dev/null)
USAGE = Usage: make ENV={prod|preprod|dev} {docker-build|docker-start|docker-stop|docker-restart}

ifndef DOCKERCOMPOSE
$(error docker-compose is not available)
endif

DC_OVERRIDE = $(shell test -e ./conf/docker-compose.override.yml && echo "--file ./conf/docker-compose.override.yml")

DC_OVERRIDE_ENV = $(shell test -e ./conf/docker-compose.$(ENV).yml && echo "--file ./conf/docker-compose.$(ENV).yml")

ifeq ($(CACHE), 1)
DC_PROFILE = --profile cache
endif

DC = $(DOCKERCOMPOSE) --env-file ./conf/parameters.env --project-name "$(CLIENT)_$(ENV)" --file ./conf/docker-compose.yml $(DC_OVERRIDE) $(DC_OVERRIDE_ENV) $(DC_PROFILE)

default:
	$(info $(USAGE))
	$(error Exiting)

docker-build:
	$(DC) pull
	$(DC) build
	$(DC) up --force-recreate --detach

docker-start:
	$(DC) start

docker-stop:
	$(DC) stop

docker-down:
	$(DC) down --volumes --rmi local

docker-restart:
	$(DC) restart

docker-rm: docker-stop
	$(DC) rm

docker-logs:
	$(DC) logs --follow

init-all: init-var-files

init-var-files:
	@echo "  --> Init default parameters"
	@cp conf/env/sample/mysql.env conf/env/mysql.env
	@echo "!! Don't forget to edit env file in conf/env/*.env !!"

config-all: config-nginx config-php config-db-root

# - empty nginx default configuration file
#   dont remove, file presence is tested on container start
# - change user nginx to user www-data
# - copy nginx app's configuration file
config-nginx:
	@echo "  --> Copying nginx configuration file"
	@docker exec $(CLIENT).nginx.$(ENV) sh -c "echo > /etc/nginx/conf.d/default.conf"
	@docker exec $(CLIENT).nginx.$(ENV) sed --in-place 's|user  nginx|user www-data|g' /etc/nginx/nginx.conf
	@docker cp ./conf/build/nginx/site.conf $(CLIENT).nginx.$(ENV):/etc/nginx/conf.d/
	@docker restart $(CLIENT).nginx.$(ENV)

config-php:
	@echo "  --> Switching php ini file to $(ENV) mode"
ifeq ($(ENV), prod)
	@docker exec $(CLIENT).php.$(ENV) ln -sf /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
endif
ifeq ($(ENV), dev)
	@docker exec $(CLIENT).php.$(ENV) ln -sf /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini
endif
	@docker restart $(CLIENT).php.$(ENV)

config-db-root:
	@echo "  --> Generating mysql auth file"
	@cat conf/env/mysql.env \
		| python3 -c "import sys; import string; v=sys.stdin.readline().split('MYSQL_ROOT_PASSWORD=')[1]; print(string.Template(open('conf/build/mysql/my.cnf.tpl').read()).substitute({'PASSWORD':v}))" \
		| docker exec -i $(CLIENT).mysql.$(ENV) sh -c 'cat > /root/.my.cnf'

db-backup: config-db-root
	@echo "  --> Backing up database"
	@mkdir -p backup/
	@docker exec $(CLIENT).mysql.$(ENV) mysqldump -uroot database > backup/mysql_$(ENV)_$(NOW).sql

db-restore: config-db-root
	@echo "  --> Restoring file to database (backup/mysql.sql)"
	@docker exec -i $(CLIENT).mysql.$(ENV) mysql -uroot database < backup/mysql.sql

pull-app:
	@echo "  --> Pulling client's app"
	git -C app/ pull

.PHONY: default docker-build docker-start docker-stop docker-rm docker-down docker-logs init-all init-var-files config-all config-nginx config-php config-db-root db-backup db-restore presta-set-domain presta-enable-ssl presta-disable-ssl presta-enable-folder-security presta-disable-folder-security pull-app
