# Variable Definitions
UID := $(shell id -u)
GID := $(shell id -g)
WEBSERVER_NAME := webserver
REDIS_CONTAINER_NAME := redis
GRUNT_CONTAINER_NAME := grunt

# Docker Network
NETWORK_NAME := shared

# Docker Compose Command
DOCKER_COMPOSE := DOCKER_UID=$(UID):$(GID) docker compose

# Aliases
ml := migration_licence_generate
mmm := migration_media_manager_generate
pml := migration_licence_prev
pmmm := migration_media_manager_prev

# Targets
build: stack_up build_containers composer migration
run: stack_up composer migration
up: stack_up composer migration
stop: stop_containers
down: stop_containers
clean: stop_containers remove_containers
logs: display_container_logs

stack_up:
	$(DOCKER_COMPOSE) up -d

build_containers:
	$(DOCKER_COMPOSE) build

stop_containers:
	$(DOCKER_COMPOSE) stop

remove_containers: stop_containers
	$(DOCKER_COMPOSE) rm -f

display_container_logs:
	$(DOCKER_COMPOSE) logs -f --tail=0 --follow

bash:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) bash

# Composer
composer:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) composer install --verbose --working-dir=src/common/

composer_update:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) composer update --verbose --working-dir=src/common/

# Doctrine Migration
migration:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) php -d xdebug.mode=off  ./Migrations/config/checkConnection.php
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) src/common/vendor/bin/doctrine-migrations migrate --no-interaction --allow-no-migration --configuration=./Migrations/config/migrationsMediaManager.php --db-configuration=./Migrations/config/migrationsDbMediaManager.php
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) php -d xdebug.mode=off ./Migrations/config/migrationLicence.php oldVersion

migration_media_manager_prev:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) src/common/vendor/bin/doctrine-migrations migrate prev --no-interaction --allow-no-migration --configuration=./Migrations/config/migrationsMediaManager.php --db-configuration=./Migrations/config/migrationsDbMediaManager.php

migration_media_manager_down:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) src/common/vendor/bin/doctrine-migrations execute --down "Migrations\MediaManager\$(VERSION)" --configuration=./Migrations/config/migrationsMediaManager.php --db-configuration=./Migrations/config/migrationsDbMediaManager.php

migration_media_manager_up:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) src/common/vendor/bin/doctrine-migrations execute --up "Migrations\MediaManager\$(VERSION)" --configuration=./Migrations/config/migrationsMediaManager.php --db-configuration=./Migrations/config/migrationsDbMediaManager.php

migration_licence_prev:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) php ./Migrations/config/migrationLicence.php oldVersion --version=prev

migration_licence_delete:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) php ./Migrations/config/migrationLicence.php deleteVersion --version=$(VERSION)

migration_licence_down:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) php ./Migrations/config/migrationLicence.php downVersion --version=$(VERSION)

migration_licence_up:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) php ./Migrations/config/migrationLicence.php upVersion --version=$(VERSION)

migration_media_manager_generate:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) php src/common/vendor/bin/doctrine-migrations generate --configuration=./Migrations/config/migrationsMediaManager.php --db-configuration=./Migrations/config/migrationsDbMediaManager.php

migration_licence_generate:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) php src/common/vendor/bin/doctrine-migrations generate --configuration=./Migrations/config/migrationsLicence.php --db-configuration=./Migrations/config/migrationsDbLicence.php

# Entity, Service, Manager Generation
esm_generate:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) php src/common/classes/classes_generators/generateESM.php

migration_licence_content_generate:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) php src/common/classes/classes_generators/generateMigration.php

# Redis
redis_flushall:
	$(DOCKER_COMPOSE) exec $(REDIS_CONTAINER_NAME) redis-cli FLUSHALL

# Anonymization
anonymize_data:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) php src/cron/anonymizeData.php $(LICENCE) $(ANONYMIZE) $(ENV)

# Grunt
grunt_watch:
	$(DOCKER_COMPOSE) exec $(GRUNT_CONTAINER_NAME) grunt --template=$(template)

grunt_cssmin:
	$(DOCKER_COMPOSE) exec $(GRUNT_CONTAINER_NAME) grunt cssmin --template=$(template)

grunt_logs:
	$(DOCKER_COMPOSE) logs -f grunt

seed_export:
	./src/common/vendor/bin/dep export -f deploy-seeding.php role=export

seed_import:
	./src/common/vendor/bin/dep import -f deploy-seeding.php role=import stage=local -vv

seed_import_preprod:
	./src/common/vendor/bin/dep import:preprod -f deploy-seeding.php role=import

licence_list:
	./src/common/vendor/bin/dep -f deploy-seeding.php print:url-local stage=local
# Run tests
test:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) ./src/common/vendor/bin/phpunit tests
test_with_filter:
	$(DOCKER_COMPOSE) exec $(WEBSERVER_NAME) ./src/common/vendor/bin/phpunit --filter $(FILTER) tests

.PHONY: db_latency db_latency_install
db_latency_install:
	@echo "Installing iproute2 within db container..."
	$(DOCKER_COMPOSE) exec -u root db sh -c "apt update && apt install -y iproute2"

db_latency:
	@if [ "$(filter-out stop,$(LATENCY))" ]; then \
		echo "Applying latency of $(LATENCY)ms to db container..."; \
		$(DOCKER_COMPOSE) exec -u root db tc qdisc replace dev eth0 root netem delay $(LATENCY)ms; \
	elif [ "$(LATENCY)" = "stop" ]; then \
		echo "Removing latency from db container..."; \
		$(DOCKER_COMPOSE) exec -u root db tc qdisc del dev eth0 root; \
	else \
		echo "Usage: make db_latency LATENCY=<value|stop>"; \
	fi