SHELL := /bin/bash
DR :=
USER="nginx"

EXEC_PHP ?= docker-compose exec -T -w /var/www/engine --user $(USER) takenplace php
RUN_PHP ?= docker-compose run --rm -w /var/www/engine --user $(USER) takenplace php
EXEC_COMPOSER ?= docker-compose exec -T -w /var/www/engine --user $(USER) takenplace composer
RUN_COMPOSER ?= docker-compose run --rm -w /var/www/engine --user $(USER) takenplace composer

# Used by the "make dump" target, to save your database with a timestamp on it.
CURRENT_DATE = `date "+%Y-%m-%d_%H-%M-%S"`

# Helper vars for pretty display
_TITLE := "\033[32m[%s]\033[0m %s\n"
_ERROR := "\033[31m[%s]\033[0m %s\n"

##
## General purpose
## ───────────────
##

.DEFAULT_GOAL := help
help: ## ❓ Show this help.
	@printf "\n Available commands:\n\n"
	@grep -E '(^[a-zA-Z_-]+:.*?##.*$$)|(^##)' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[32m%-25s\033[0m %s\n", $$1, $$2}' | sed -e 's/\[32m## */[33m/'
.PHONY: help

##
## Project
## ───────
##

start: ## 🚀 Start the PHP and Database containers.
	@printf $(_TITLE) "Server" "Start PHP"
	@$(DR) docker-compose up -d
.PHONY: start

stop: ## 🛑 Stop the Docker containers.
	@printf $(_TITLE) "Docker" "Stop containers"
	-@$(DR) docker-compose stop
.PHONY: stop

oc:
	@printf $(_TITLE) "Project" "Optimize Clear"
	@$(DR) $(RUN_PHP) artisan optimize:clear
.PHONY: oc

migrate:
	@printf $(_TITLE) "Project" "Run Migrations"
	@$(DR) $(RUN_PHP) artisan migrate:refresh
.PHONY: migrate

seed:
	@printf $(_TITLE) "Project" "Run DB Seeds"
	@$(DR) $(RUN_PHP) artisan db:seed
.PHONY: seed

##
## Setup
## ─────
##

install: remove-files env docker vendor oc ## 🏗️ Install and start the project.
.PHONY: install

uninstall: ## Uninstall the Docker containers.
	@printf $(_TITLE) "Docker" "Kill containers"
	-@$(DR) docker-compose down --remove-orphans
.PHONY: uninstall

remove-files:
	@printf $(_TITLE) "PHP" "Remove some files"
	@$(DR) rm -f storage/installed .php-cs-fixer.cache
.PHONY: remove-files

env:
	cp .env.docker .env
.PHONY: env

docker:
	@printf $(_TITLE) "Project" "Build Docker images"
	@$(DR) docker-compose up --build -d
.PHONY: docker

vendor: ## 🐘 Install Composer dependencies.
	@printf $(_TITLE) "PHP" "Install Composer dependencies"
	@$(DR) $(RUN_COMPOSER) install -vvv
.PHONY: vendor

composer: ## Execute composer commands.
	$(DR) $(RUN_COMPOSER) $(c)
.PHONY: composer

artisan: ## Execute artisan commands.
	$(DR) $(RUN_PHP) artisan $(c)
.PHONY: artisan

##
## Quality assurance
## ─────────────────
##

qa: ## Execute QA tools
	$(DR) $(MAKE) cs
	$(DR) $(MAKE) phpstan
.PHONY: qa

phpstan: ## Execute PHPStan.
	@printf "\n"$(_TITLE) "QA" "phpstan"
	@$(DR) $(EXEC_PHP) -d memory_limit=1G ./vendor/bin/phpstan analyse
.PHONY: phpstan

cs: ## Execute php-cs-fixer.
	@printf $(_TITLE) "QA" "php-cs-fixer"
	@$(DR) $(EXEC_PHP) ./vendor/bin/php-cs-fixer fix
.PHONY: cs

phpunit: ## Execute PHPUnit.
	@printf "\n"$(_TITLE) "PHP" "phpunit"
	@$(DR) $(EXEC_PHP) artisan test
.PHONY: phpunit
