SHELL := /bin/bash

PYTHON ?= python3
VENV := .venv
VENV_PYTHON := $(VENV)/bin/python
VENV_PIP := $(VENV_PYTHON) -m pip

.PHONY: help venv install dev format lint typecheck test docs docs-open docs-clean check clean build publish-check publish-test publish

help:
	@echo "Cibles disponibles :"
	@echo "  venv          Crée l'environnement virtuel"
	@echo "  install       Installe la CLI en mode éditable"
	@echo "  dev           Installe les outils de développement et publication"
	@echo "  format        Formate le code Python"
	@echo "  lint          Vérifie le style avec Ruff"
	@echo "  typecheck     Vérifie les types avec mypy"
	@echo "  test          Exécute les tests avec couverture"
	@echo "  docs          Génère la documentation HTML avec Sphinx"
	@echo "  docs-open     Ouvre la documentation générée"
	@echo "  docs-clean    Supprime la documentation générée"
	@echo "  check         Exécute lint, typecheck, test et docs"
	@echo "  build         Construit les distributions wheel et source"
	@echo "  publish-check Contrôle les distributions avec Twine"
	@echo "  publish-test  Publie sur TestPyPI"
	@echo "  publish       Publie sur PyPI après confirmation"

$(VENV)/pyvenv.cfg:
	$(PYTHON) -m venv $(VENV)

venv: $(VENV)/pyvenv.cfg

install: venv
	$(VENV_PIP) install --upgrade pip
	$(VENV_PIP) install --editable .

dev: venv
	$(VENV_PIP) install --upgrade pip
	$(VENV_PIP) install --editable ".[dev,docs,publish]"

format: dev
	$(VENV_PYTHON) -m ruff format src tests
	$(VENV_PYTHON) -m ruff check --fix src tests

lint: dev
	$(VENV_PYTHON) -m ruff format --check src tests
	$(VENV_PYTHON) -m ruff check src tests

typecheck: dev
	$(VENV_PYTHON) -m mypy src

test: dev
	$(VENV_PYTHON) -m pytest --cov=auditio_db_pattern --cov-report=term-missing

docs: dev
	$(VENV_PYTHON) -m sphinx -W --keep-going -b html docs docs/_build/html

docs-open: docs
	xdg-open docs/_build/html/index.html

docs-clean:
	rm -rf docs/_build

check: lint typecheck test docs

clean: docs-clean
	rm -rf build dist .coverage htmlcov

build: dev clean
	$(VENV_PYTHON) -m build

publish-check: build
	$(VENV_PYTHON) -m twine check dist/*

publish-test: publish-check
	$(VENV_PYTHON) -m twine upload --repository testpypi dist/*

publish: publish-check
	@read -r -p "Publier auditio-db-pattern sur PyPI ? [y/N] " answer; \
	if [[ "$$answer" != "y" && "$$answer" != "Y" ]]; then \
		echo "Publication annulée."; \
		exit 1; \
	fi
	$(VENV_PYTHON) -m twine upload dist/*
