# Variables configurables
PYTHON = python3
PIP = $(PYTHON) -m pip
BUILD = $(PYTHON) -m build
TWINE = twine

.PHONY: help init install clean format lint test coverage build check-release release-test release

# --- 1. AYUDA Y CONFIGURACIÓN ---

help: ## Muestra este mensaje de ayuda con todas las opciones disponibles
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'

init: ## Inicializa el entorno virtual e instala/actualiza herramientas críticas de desarrollo
	$(PIP) install --upgrade pip build twine ruff mypy pytest pytest-cov

install: ## Instala el paquete en modo editable junto con todas sus dependencias de desarrollo
	$(PIP) install -e .[dev]

# --- 2. CALIDAD DE CÓDIGO Y ESTILO ---

format: ## Autoformatea el código y ordena los imports utilizando Ruff
	ruff format .
	ruff check . --select I --fix

lint: ## Ejecuta el linter (Ruff) para buscar errores y malas prácticas sin modificar archivos
	ruff check .

typecheck: ## Ejecuta el verificador de tipos estáticos (Mypy)
	mypy .

# --- 3. PRUEBAS ---

test: ## Ejecuta la suite de pruebas unitarias con Pytest
	pytest

coverage: ## Ejecuta las pruebas y genera un reporte detallado de cobertura en la terminal y en HTML
	pytest --cov=. --cov-report=term-missing --cov-report=html

# --- 4. COMPILACIÓN Y CONSTRUCCIÓN ---

clean: ## Remueve todos los archivos temporales, cachés y artefactos de compilación previos
	rm -rf build/
	rm -rf dist/
	rm -rf *.egg-info
	rm -rf .egg-info
	find . -type d -name  "__pycache__" -exec rm -rf {} +
	find . -type f -name "*.pyc" -delete
	find . -type f -name "*.pyo" -delete
	rm -rf .pytest_cache/
	rm -rf .htmlcov/
	rm -rf .coverage
	rm -rf .mypy_cache/
	rm -rf .ruff_cache/

build: clean ## Compila el paquete generando los archivos fuente (sdist) y el paquete distribuible (wheel)
	$(BUILD)

check-release: build ## Verifica que las descripciones y metadatos del paquete compilado cumplan con las reglas de PyPI
	$(TWINE) check dist/*

# --- 5. PUBLICACIÓN Y LANZAMIENTO ---

release-test: check-release ## Sube de forma segura el paquete compilado al entorno de pruebas TestPyPI
	$(TWINE) upload --repository testpypi dist/*

release: check-release ## Publica la versión definitiva del paquete en el repositorio oficial de PyPI
	$(TWINE) upload dist/*