.PHONY: help local prod build start stop restart logs shell migrate lint test

# Couleurs
GREEN = \033[0;32m
YELLOW = \033[0;33m
NC = \033[0m

help: ## Affiche cette aide
	@echo "${GREEN}Commandes disponibles :${NC}"
	@echo ""
	@echo "${YELLOW}Développement local :${NC}"
	@awk -F ':.*?## |## ' '/^## Local ##/ {f=1} /^[a-zA-Z_-]+:.*?## / {sub(":", "", $$1); printf "  ${GREEN}%-15s${NC} %s\n", $$1, $$2}' $(MAKEFILE_LIST)
	@echo ""
	@echo "${YELLOW}Production :${NC}"
	@awk -F ':.*?## |## ' '/^## Prod ##/ {f=1} /^[a-zA-Z_-]+:.*?## / {sub(":", "", $$1); printf "  ${GREEN}%-15s${NC} %s\n", $$1, $$2}' $(MAKEFILE_LIST)

## Local ##

local: start install ## Lance l'environnement de développement complet

start: ## Démarre les conteneurs Docker en local
	@docker compose up -d

stop: ## Arrête les conteneurs Docker
	@docker compose down

restart: stop start ## Redémarre les conteneurs

install: ## Installe les dépendances PHP et JS
	@docker compose exec www composer install
	@docker compose exec www npm install
	@docker compose exec www npm run dev

logs: ## Affiche les logs des conteneurs
	@docker compose logs -f

shell: ## Ouvre un shell dans le conteneur www
	@docker compose exec www bash

migrate: ## Exécute les migrations de base de données
	@docker compose exec www php bin/console doctrine:migrations:migrate -n

fixtures: ## Charge les fixtures (dev uniquement)
	@docker compose exec www php bin/console doctrine:fixtures:load -n

lint: ## Analyse le code avec PHPStan et ESLint
	@docker compose exec www vendor/bin/phpstan analyse
	@docker compose exec www npm run lint

test: ## Exécute les tests PHP et JS
	@docker compose exec www php bin/phpunit
	@docker compose exec www npm test

db-reset: ## Réinitialise complètement la base de données (dev)
	@docker compose exec www php bin/console doctrine:database:drop --force --if-exists
	@docker compose exec www php bin/console doctrine:database:create
	@docker compose exec www php bin/console doctrine:migrations:migrate -n
	@docker compose exec www php bin/console doctrine:fixtures:load -n

## Prod ##

prod: build deploy ## Déploie en production (build + deploy)

build: ## Build les images Docker pour la production
	@docker compose -f docker-compose.prod.yml build --no-cache

deploy: ## Démarre les conteneurs en production
	@docker compose -f docker-compose.prod.yml up -d

prod-migrate: ## Exécute les migrations en production
	@docker compose -f docker-compose.prod.yml exec www php bin/console doctrine:migrations:migrate -n

prod-logs: ## Affiche les logs de production
	@docker compose -f docker-compose.prod.yml logs -f

prod-monitor: ## Surveille l'état des conteneurs
	@docker compose -f docker-compose.prod.yml ps

prod-backup: ## Crée un backup de la base de données
	@mkdir -p backups
	@docker compose -f docker-compose.prod.yml exec db sh -c 'mysqldump -u $$MYSQL_USER -p$$MYSQL_PASSWORD $$MYSQL_DATABASE' > backups/backup_$(shell date +%Y%m%d%H%M%S).sql

generate_front_routes:
	rm -f /assets/js/routes.json
	@docker compose exec www php bin/console fos:js-routing:dump --format=json --target=assets/js/routes.json

trad:
	@docker compose exec www php bin/console bazinga:js-translation:dump

build-front: generate_front_routes trad
	npm run build

deploy-front-build-to-ovh: trad build-front
	scp -r public/build/ batrams@ssh.cluster023.hosting.ovh.net:/homez.122/batrams/Kplan/public

deploy-on-server:
	php composer.phar install
	php bin/console doctrine:migrations:migrate -n
	npm install
	npm run build
	php bin/console bazinga:js-translation:dump
	php bin/console fos:js-routing:dump --format=json --target=assets/js/routes.json
	php bin/console assets:install --symlink
	php bin/console cache:clear


TAG ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo manual)
IMAGE = massambafall92/kplan-www

login:
	docker login -u massambafall92

build:
	docker build -t $(IMAGE):latest -t $(IMAGE):$(TAG) -f Dockerfile .

push:
	docker push $(IMAGE):latest && docker push $(IMAGE):$(TAG)

deploy:
	@grep -q '^KPLAN_IMAGE=' docker-stack.env || echo "KPLAN_IMAGE=$(IMAGE):$(TAG)" >> docker-stack.env
	docker stack deploy -c docker-stack.yml kplan

update:
	docker service update --image $(IMAGE):$(TAG) kplan_www
	docker service update --image $(IMAGE):$(TAG) kplan_worker
.PHONY: help \
	local start stop restart install logs shell migrate fixtures lint test db-reset \
	prod build-compose compose-up prod-migrate prod-logs prod-monitor prod-backup \
	generate_front_routes trad build-front deploy-front-build-to-ovh deploy-on-server \
	login build-image push deploy-stack update-www ps stack-logs

# =========================
# Config variables
# =========================
IMAGE        ?= massambafall92/kplan-www
TAG          ?= $(shell git rev-parse --short HEAD 2>/dev/null || date +%Y%m%d%H%M%S)
STACK_NAME   ?= kplan
STACK_FILE   ?= docker-stack.yml        # Swarm stack file
ENV_FILE     ?= .env                    # exported before stack deploy

# =========================
# Colors (for help)
# =========================
GREEN  = \033[0;32m
YELLOW = \033[0;33m
NC     = \033[0m

help: ## Affiche cette aide
	@echo "${GREEN}Commandes disponibles :${NC}"
	@echo ""
	@echo "${YELLOW}Développement local (docker compose) :${NC}"
	@awk -F ':.*?## |## ' '/^## Local ##/ {f=1} /^[a-zA-Z_-]+:.*?## / {sub(":", "", $$1); if (f) printf "  ${GREEN}%-18s${NC} %s\n", $$1, $$2}' $(MAKEFILE_LIST)
	@echo ""
	@echo "${YELLOW}Production (docker compose prod) :${NC}"
	@awk -F ':.*?## |## ' '/^## Prod ##/ {f=1} /^[a-zA-Z_-]+:.*?## / {sub(":", "", $$1); if (f) printf "  ${GREEN}%-18s${NC} %s\n", $$1, $$2}' $(MAKEFILE_LIST)
	@echo ""
	@echo "${YELLOW}Swarm (stack) :${NC}"
	@awk -F ':.*?## |## ' '/^## Swarm ##/ {f=1} /^[a-zA-Z_-]+:.*?## / {sub(":", "", $$1); if (f) printf "  ${GREEN}%-18s${NC} %s\n", $$1, $$2}' $(MAKEFILE_LIST)

## Local ##
local: start install ## Lance l'environnement de développement complet
start: ## Démarre les conteneurs Docker en local
	docker compose up -d
stop: ## Arrête les conteneurs Docker
	docker compose down
restart: stop start ## Redémarre les conteneurs
install: ## Installe les dépendances PHP et JS
	docker compose exec www composer install
	docker compose exec www npm install
	docker compose exec www npm run dev
logs: ## Affiche les logs des conteneurs
	docker compose logs -f
shell: ## Ouvre un shell dans le conteneur www
	docker compose exec www bash
migrate: ## Exécute les migrations de base de données
	docker compose exec www php bin/console doctrine:migrations:migrate -n
fixtures: ## Charge les fixtures (dev uniquement)
	docker compose exec www php bin/console doctrine:fixtures:load -n
lint: ## Analyse le code avec PHPStan et ESLint
	docker compose exec www vendor/bin/phpstan analyse
	docker compose exec www npm run lint
test: ## Exécute les tests PHP et JS
	docker compose exec www php bin/phpunit
	docker compose exec www npm test
db-reset: ## Réinitialise complètement la base de données (dev)
	docker compose exec www php bin/console doctrine:database:drop --force --if-exists
	docker compose exec www php bin/console doctrine:database:create
	docker compose exec www php bin/console doctrine:migrations:migrate -n
	docker compose exec www php bin/console doctrine:fixtures:load -n

## Prod ##
prod: build-compose compose-up ## Déploie en production (build + up) via docker compose prod
build-compose: ## Build les images Docker pour la production (docker-compose.prod.yml)
	docker compose -f docker-compose.prod.yml build --no-cache
compose-up: ## Démarre les conteneurs en production (docker-compose.prod.yml)
	docker compose -f docker-compose.prod.yml up -d
prod-migrate: ## Exécute les migrations en production
	docker compose -f docker-compose.prod.yml exec www php bin/console doctrine:migrations:migrate -n
prod-logs: ## Affiche les logs de production
	docker compose -f docker-compose.prod.yml logs -f
prod-monitor: ## Surveille l'état des conteneurs
	docker compose -f docker-compose.prod.yml ps
prod-backup: ## Crée un backup de la base de données (containeur db dans docker-compose.prod.yml)
	mkdir -p backups
	docker compose -f docker-compose.prod.yml exec db sh -c 'mysqldump -u $$MYSQL_USER -p$$MYSQL_PASSWORD $$MYSQL_DATABASE' > backups/backup_$(shell date +%Y%m%d%H%M%S).sql

generate_front_routes: ## (dev) Génère les routes JS (FOSJsRouting)
	rm -f assets/js/routes.json
	docker compose exec www php bin/console fos:js-routing:dump --format=json --target=assets/js/routes.json
trad: ## (dev) Dump des traductions JS (Bazinga)
	docker compose exec www php bin/console bazinga:js-translation:dump
build-front: generate_front_routes trad ## (dev) Build du front
	npm run build
deploy-front-build-to-ovh: trad build-front ## Copie le build front vers OVH
	scp -r public/build/ batrams@ssh.cluster023.hosting.ovh.net:/homez.122/batrams/Kplan/public
deploy-on-server: ## Déploiement manuel (sans Docker) – à éviter
	php composer.phar install
	php bin/console doctrine:migrations:migrate -n
	npm install
	npm run build
	php bin/console bazinga:js-translation:dump
	php bin/console fos:js-routing:dump --format=json --target=assets/js/routes.json
	php bin/console assets:install --symlink
	php bin/console cache:clear

## Swarm ##
login: ## Login Docker Hub (utiliser DOCKERHUB_TOKEN exporté)
	@echo "$$DOCKERHUB_TOKEN" | docker login -u "massambafall92" --password-stdin

build-image: ## Build & push image (amd64 only, Dockerfile stack)
	docker buildx create --use 2>/dev/null || true
	docker buildx build --platform linux/amd64 \
		-t $(IMAGE):latest \
		-t $(IMAGE):$(TAG) \
		-f docker/php/stack/Dockerfile \
		. --push

push: ## Push des tags latest et $(TAG)
	docker push $(IMAGE):latest
	docker push $(IMAGE):$(TAG)

deploy-stack: ## Déploie/Met à jour la stack Swarm (lit $(ENV_FILE) si présent)
	@test -f $(ENV_FILE) && echo "Export $(ENV_FILE)" && set -a && . ./$(ENV_FILE) && set +a || true
	docker stack deploy -c $(STACK_FILE) --with-registry-auth --prune $(STACK_NAME)

update-www: ## Met à jour uniquement le service www avec l'image taggée
	docker service update --image $(IMAGE):$(TAG) $(STACK_NAME)_www

ps: ## Liste les services de la stack
	docker stack services $(STACK_NAME)

stack-logs: ## Affiche les logs du service www
	docker service logs -f $(STACK_NAME)_www