# Makefile racine — Fail2banActionBanishment
# NB : les lignes de recette Make DOIVENT être indentées par une tabulation
# (contrainte de l'outil Make lui-même, seule exception à la règle "4 espaces"
# du projet, cf. ROADMAP.md Phase 0).

.PHONY: install uninstall status test lint docs docs-serve run worker mqtt master-client master-listen deploy join-token join dump-db install-master install-mariadb install-nginx install-supervisor uninstall-supervisor help

EMITTER_DIR := emitter
EMITTER_VENV := $(EMITTER_DIR)/.venv
EMITTER_PYTHON := $(EMITTER_VENV)/bin/python

# Crée le venv de l'émetteur et installe ses dépendances s'il n'existe pas
# encore (évite le "pas de virtual env" quand run/worker/test/mqtt sont
# lancés sans avoir suivi la procédure manuelle du README).
$(EMITTER_VENV)/bin/activate: $(EMITTER_DIR)/requirements.txt
	python3 -m venv $(EMITTER_VENV)
	$(EMITTER_PYTHON) -m pip install --quiet --upgrade pip
	$(EMITTER_PYTHON) -m pip install --quiet -r $(EMITTER_DIR)/requirements.txt
	touch $(EMITTER_VENV)/bin/activate

help: ## Affiche cette aide
	@grep -E '^[a-zA-Z_-]+:.*## ' $(MAKEFILE_LIST) | sed 's/:.*## /\t/'

install: ## Déploie le noeud (paquets, configuration, services) — nécessite root
	sudo ./install.sh install

uninstall: ## Arrête et désactive les services installés (ne supprime pas les fichiers déployés)
	sudo systemctl disable --now fail2ban.service firewall.service mosquitto.service

status: ## Vérifie l'état des services (firewall, fail2ban, mosquitto)
	sudo ./install.sh status

test: $(EMITTER_VENV)/bin/activate ## Vérifie les filtres fail2ban custom + tests Django (émetteur)
	./scripts/test-fail2ban-filters.sh
	$(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py test

lint: $(EMITTER_VENV)/bin/activate ## Vérifie le typage Python (pyright) et la syntaxe des scripts shell (shellcheck) — nécessite pyright/shellcheck sur le PATH (voir README)
	$(EMITTER_PYTHON) -m pip install --quiet -r $(EMITTER_DIR)/requirements-dev.txt
	pyright
	shellcheck install.sh scripts/*.sh generic/firewall/firewall-launcher.sh

docs: $(EMITTER_VENV)/bin/activate ## Génère le site de documentation mkdocs dans site/ (fr/en) — prévisualiser avec 'make docs-serve'
	$(EMITTER_PYTHON) -m pip install --quiet -r requirements-docs.txt
	$(EMITTER_PYTHON) -m mkdocs build

docs-serve: $(EMITTER_VENV)/bin/activate ## Sert la documentation en local avec rechargement à chaud (http://127.0.0.1:8001/)
	$(EMITTER_PYTHON) -m pip install --quiet -r requirements-docs.txt
	$(EMITTER_PYTHON) -m mkdocs serve -a 127.0.0.1:8001

run: $(EMITTER_VENV)/bin/activate ## Lance l'émetteur Django en mode développement (dev server ; MQTT/Celery à lancer à part, voir make mqtt/worker)
	$(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py migrate
	$(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py runserver

mqtt: $(EMITTER_VENV)/bin/activate ## Lance l'ingestion MQTT de l'émetteur (manage.py mqtt_listen)
	$(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py mqtt_listen

worker: $(EMITTER_VENV)/bin/activate ## Lance le worker Celery (géolocalisation asynchrone des IP bannies)
	cd $(EMITTER_DIR) && .venv/bin/celery -A config worker -l info

master-client: $(EMITTER_VENV)/bin/activate ## Lance le relais vers le broker master (Phase 2.b, mTLS — voir MQTT_MASTER_* dans .env)
	$(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py master_client

master-listen: $(EMITTER_VENV)/bin/activate ## Lance l'ingestion côté master (Phase 3, tous les noeuds — cert master-internal)
	$(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py master_listen

deploy: install ## Alias de production pour install, sur le VPS cible

join-token: $(EMITTER_VENV)/bin/activate ## Émet un jeton d'auto-inscription pour un nouveau noeud (MASTER uniquement) — usage: make join-token NODE=<nom> [TTL=<minutes>]
	@if [ -z "$(NODE)" ]; then echo "Usage: make join-token NODE=<nom> [TTL=<minutes>]" >&2; exit 1; fi
	$(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py create_join_token $(NODE) $(if $(TTL),--ttl-minutes $(TTL))

join: ## Auto-inscrit CE noeud auprès du master, avec le jeton reçu via 'make join-token' côté master — usage: make join MASTER=<url> NODE=<nom> TOKEN=<jeton> — nécessite root
	@if [ -z "$(MASTER)" ] || [ -z "$(NODE)" ] || [ -z "$(TOKEN)" ]; then \
		echo "Usage: make join MASTER=<url> NODE=<nom> TOKEN=<jeton>" >&2; exit 1; \
	fi
	sudo ./install.sh join --master $(MASTER) --node $(NODE) --token $(TOKEN)

dump-db: $(EMITTER_VENV)/bin/activate ## Dump JSON portable de la base (Django dumpdata) en vue d'un portage vers mariadb/postgresql — recharger ensuite avec manage.py loaddata après bascule DB_ENGINE
	$(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py dumpdata --natural-foreign --natural-primary \
		-e contenttypes -e auth.permission -e sessions \
		-o $(EMITTER_DIR)/db-dump-$$(date +%Y%m%d-%H%M%S).json
	@echo "Dump créé dans $(EMITTER_DIR)/. Après bascule DB_ENGINE (make install-mariadb, ou"
	@echo "DB_ENGINE=postgresql dans .env + migrate), recharger avec :"
	@echo "  $(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py loaddata <fichier>.json"

install-master: ## Déploie le broker master (CA privée, ACL, ingestion multi-noeuds) — opt-in, nécessite root
	sudo ./install.sh install-master

install-mariadb: ## Bascule la base de données de SQLite vers MariaDB (base/utilisateur créés) — opt-in, nécessite root, relancer 'make install' ensuite
	sudo ./install.sh install-mariadb

install-nginx: ## Déploie nginx + certificat Let's Encrypt devant le tableau de bord (voir DASHBOARD_DOMAIN dans .env) — nécessite root
	sudo ./install.sh install-nginx

install-supervisor: ## Bascule les services de l'émetteur de systemd vers supervisor (option, VPS)
	sudo ./install.sh install-supervisor

uninstall-supervisor: ## Revient à systemd (arrête supervisor, réactive les services systemd)
	sudo ./install.sh uninstall-supervisor
