.DEFAULT_GOAL := help

export UID := $(shell id -u)
export ENV ?= dev
export DEBUG = 1
export DOCKER_PHP_PORT = 9000
export DOCKER_MYSQL_PORT = 3306
export DOCKER_NGINX_PORT = 80
export DOCKER_NODEJS_LIVERELOAD_PORT = 35729
export DOCKER_NODEJS_HTTP_PORT = 8080
export PHP_DATE_TIMEZONE = UTC
export PHP_MEMORY_LIMIT = -1
export DATABASE_URL = mysql://root@mysql/sylius_plugin_$(ENV)

DOCKER_OPTIONS = -u $(UID)
DOCKER_UP_OPTIONS = --remove-orphans -d
DOCKER_CMD = docker-compose
DOCKER_COMPOSE_RUN = $(DOCKER_CMD) run --rm
DOCKER_COMPOSE_EXEC = $(DOCKER_CMD) exec $(DOCKER_OPTIONS)

NPM_CMD = $(DOCKER_COMPOSE_RUN) node npm
PHP_CMD = $(DOCKER_COMPOSE_EXEC) php
CONSOLE_CMD = $(PHP_CMD) bin/console
BUILD_CMD = $(NPM_CMD) run build
COMPOSER_CMD = $(DOCKER_COMPOSE_RUN) composer composer
COMPOSER_CMD_INSTALL = $(COMPOSER_CMD) install

ifeq ($(ENV),ci)
	NPM_CMD = npm
	PHP_CMD = php
	COMPOSER_CMD = composer
	COMPOSER_CMD_INSTALL = $(COMPOSER_CMD) install --no-scripts
	NPM_CMD_INSTALL = $(NPM_CMD) ci --ignore-script
endif

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

##
## Project setup
## ENV = dev (default) | production | ci
##---------------------------------------------------------------

.PHONY: start
start: pull docker-compose.yaml ## Build docker images and up containers
	@$(DOCKER_CMD) up $(DOCKER_UP_OPTIONS)

.PHONY: stop
restart: stop ## Restart docker containers
	@$(DOCKER_CMD) up $(DOCKER_UP_OPTIONS)

.PHONY: pull
pull:
	@$(DOCKER_CMD) pull --quiet

.PHONY: stop
stop: ## Stop docker containers
	@$(DOCKER_CMD) stop

.PHONY: fixtures
fixtures: ## Install fixtures
	@$(CONSOLE_CMD) sylius:fixtures:load --no-interaction

.PHONY: assets
assets: ## Install assets
	@$(CONSOLE_CMD) assets:install public

.PHONY: build
build: tests/Application/node_modules ## Build javascript / scss
	@$(DOCKER_COMPOSE_RUN) php bash -c "cd ../.. && rm -rf node_modules && php bin/create_node_symlink.php"
	@$(BUILD_CMD)

.PHONY: clean
clean: stop ## Stop docker containers and remove all dependances files
	@echo "Removing dependances files..."
	@sudo rm -rf tests/Application/node_modules vendor tests/Application/var/cache tests/Application/var/log tests/Application/public/assets tests/Application/public/bundles
	@echo "Done !"

.PHONY: clear
clear: clean ## Remove all dependances files and docker containers
	@echo "Removing docker containers..."
	@$(DOCKER_CMD) down -v --remove-orphans
	@echo "Done !"

##
## Developpment
##---------------------------------------------------------------

.PHONY: cache-clear
cache-clear: ## Clear symfony cache
	@$(CONSOLE_CMD) cache:clear --env=$(ENV)

.PHONY: logs-node
logs-node: ## Display logs node
	@$(DOCKER_CMD) logs -f node

.PHONY: logs-php
logs-php: ## Display logs php
	@$(DOCKER_CMD) logs -f php

.PHONY: logs-apache
logs-apache: ## Display logs nginx
	@$(DOCKER_COMPOSE_EXEC) apache bash -c "tail -f /var/log/apache2/error.log"

tests/Application/node_modules:
	@$(NPM_CMD) install

##
## Migrations - Database
##----------------------------------------------------------------------------

.PHONY: db-validate
db-validate: ## Checks and validate mapping informations
	@$(PHP_CMD) bin/console doctrine:schema:validate

.PHONY: db-update
db-update: ## Sync database with schema
	@$(PHP_CMD) bin/console doctrine:schema:update --force

.PHONY: db-create
db-create: ## Create database
	@$(PHP_CMD) bin/console doctrine:database:create --if-not-exists

.PHONY: db-drop
db-drop: ## Checks and validate mapping informations
	@$(PHP_CMD) bin/console doctrine:database:drop --force --if-exists

.PHONY: init-db-with-fixtures
init-db-with-fixtures: db-drop db-create db-update fixtures ## Initialize database with fixtures

##
## Symfony
##----------------------------------------------------------------------------

.PHONY: debug-router
debug-router: ## Displays routing informations
	@$(PHP_CMD) bin/console debug:router

.PHONY: debug-container
debug-container: ## Displays services informations
	@$(PHP_CMD) bin/console debug:container

##
## ECS
##----------------------------------------------------------------------------
.PHONY: front-test-cs
front-test-cs: tests/Application/node_modules ## Execute tests of coding style for frontend
	@$(NPM_CMD) run test:cs

.PHONY: test-cs
test-cs: front-test-cs ## Execute tests of coding style

vendor/autoload.php: composer.json
	@$(COMPOSER_CMD_INSTALL)
