.PHONY: dev dev_checks composer_install clean_db up down start stop status help csfix stan validate_doctrine_scheme clear_cache
.DEFAULT_GOAL := help

ROOT_DIR := $(shell pwd)
DOCKER_COMPOSE := $(shell which docker-compose)
DOCKER := $(shell which docker)

help:
	@echo "--> You are running default target. Look at the Makefile to see other available targets."

# Set ups dev environment, cleans DB
dev: up composer_install clean_db run_fixtures_purge

# Runs developer checks that are run in git hooks too
dev_checks: csfix stan validate_doctrine_scheme

# Helper command when changing branch
build_latest_version:
	@$DOCKER_COMPOSE} exec backend composer install # also cleans cache and dumps autoload files
	@${DOCKER_COMPOSE} exec backend bin/console doctrine:migrations:migrate --no-interaction --quiet

# GIT HOOKS
setup_hooks:
	# Setup commit msg hook
	@cp ${ROOT_DIR}/__hooks/commit-msg ${ROOT_DIR}/.git/hooks/commit-msg
	# Setup pre commit hook
	@cp ${ROOT_DIR}/__hooks/pre-commit ${ROOT_DIR}/.git/hooks/pre-commit
	# Setup pre push hook
	@cp ${ROOT_DIR}/__hooks/pre-push ${ROOT_DIR}/.git/hooks/pre-push

clear_hooks:
	# Clear commit msg hook
	@rm ${ROOT_DIR}/.git/hooks/commit-msg
	# Clear pre commit hook
	@rm ${ROOT_DIR}/.git/hooks/pre-commit
	# Clear pre push hook
	@rm ${ROOT_DIR}/.git/hooks/pre-push

# Runs composer install and installs project dependencies
composer_install:
	@echo "--> Installing php dependencies"
	@${DOCKER_COMPOSE} exec backend composer install

# DATABASE MIGRATIONS
clean_db: sync_doctrine_storage
	@echo "--> Refreshing database"
	# Migrate down all
	@${DOCKER_COMPOSE} exec backend bin/console doctrine:schema:drop --full-database --force
	# Migrate up all
	@${DOCKER_COMPOSE} exec backend bin/console d:m:m --no-interaction --quiet

migration_latest:
	@echo "--> Running new migrations"
	@${DOCKER_COMPOSE} exec backend bin/console d:m:m

migration_rollback:
	@echo "--> Rolling back latest migration"
	@${DOCKER_COMPOSE} exec backend bin/console d:m:m prev

migration_diff:
	@echo "--> Generating new migration(s) based on differences"
	@${DOCKER_COMPOSE} exec backend bin/console d:m:diff

migration_generate:
	@echo "--> Generating empty migration"
	@${DOCKER_COMPOSE} exec backend bin/console d:m:gen

sync_doctrine_storage:
	# Sync meta data database
	@${DOCKER_COMPOSE} exec backend bin/console doctrine:migrations:sync-metadata-storage --quiet

# DOCKER COMMANDS
up:
	@echo "--> starting project containers"
	@${DOCKER_COMPOSE} up -d

start:
	@echo "--> starting existing project containers"
	@${DOCKER_COMPOSE} start

stop:
	@echo "--> stoping project containers"
	@${DOCKER_COMPOSE} stop

down:
	@echo "--> removing project containers"
	@${DOCKER_COMPOSE} down

status:
	@$(DOCKER) ps

# DEV CODE QUALITY CHECKS
stan:
	@${DOCKER_COMPOSE} exec backend vendor/bin/phpstan analyze -c phpstan.dist.neon

csfix:
	@${DOCKER_COMPOSE} exec backend vendor/bin/php-cs-fixer fix --ansi -v --config=.php-cs-fixer.dist.php --path-mode=intersection src fixtures migrations

validate_doctrine_scheme:
	@${DOCKER_COMPOSE} exec backend bin/console doctrine:schema:validate

# Rector is helper tool for code quality checkups. It uses the config from rector.php file in the root directory
rector:
	@${DOCKER_COMPOSE} exec backend vendor/bin/rector process src --dry-run

# TESTS
tests:
	@${DOCKER_COMPOSE} exec backend vendor/bin/phpunit src

#CACHE
clear_cache:
	@${DOCKER_COMPOSE} exec backend bin/console cache:clear

# DATABASE
dump_db:
	@echo "--> Dumping database to current directory"
	@$(DOCKER) exec -t yammat-backend-storage-1 pg_dumpall --inserts -c -U yammat > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

dump_inserts_db:
	@echo "--> Dumping database inserts to current directory"
	@$(DOCKER) exec -t yammat-backend-storage-1 pg_dump --column-inserts --data-only -U yammat > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

# Purges database before adding the entries
run_fixtures_purge:
	@${DOCKER_COMPOSE} exec backend bin/console doctrine:fixtures:load

# Doesn't purge database, only adds new entries
run_fixtures_append:
	@${DOCKER_COMPOSE} exec backend bin/console doctrine:fixtures:load --append

# TRAEFIK
traefik_build:
	@$(DOCKER) run -d -p 9999:9999 -p 80:80 -p 443:443 -v /var/run/docker.sock:/var/run/docker.sock:ro --name traefik_loc --restart unless-stopped --network web asynclabsco/traefik-loc:latest

traefik_start:
	@$(DOCKER) start traefik_loc
