# =============================================================================
# textual-docs-mcp Makefile
# =============================================================================

.PHONY: install dev test lint format typecheck deadcode build clean \
        publish-pypi publish-ghcr docker-build docker-run bundle help

# Default target
.DEFAULT_GOAL := help

# Project settings
PACKAGE := textual_docs_mcp
SRC_DIR := src
TEST_DIR := .tests
SCRIPTS_DIR := scripts

# Docker settings
DOCKER_IMAGE := textual-docs-mcp
GHCR_IMAGE := ghcr.io/diaz3618/textual-docs-mcp

# =============================================================================
# Development
# =============================================================================

install:
	uv pip install .

dev:
	uv pip install -e ".[dev]"

test:
	pytest $(TEST_DIR)/ --tb=short --cov=$(PACKAGE) --cov-report=term-missing

lint:
	ruff check $(SRC_DIR)/ $(TEST_DIR)/ $(SCRIPTS_DIR)/

format:
	ruff format $(SRC_DIR)/ $(TEST_DIR)/ $(SCRIPTS_DIR)/
	ruff check --fix $(SRC_DIR)/ $(TEST_DIR)/ $(SCRIPTS_DIR)/

typecheck:
	mypy $(SRC_DIR)/

deadcode:
	vulture $(SRC_DIR)/ --min-confidence 70

check: lint typecheck deadcode

# =============================================================================
# Build & Publish
# =============================================================================

build:
	python -m build

clean:
	rm -rf dist/ build/ *.egg-info src/*.egg-info
	find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
	find . -type f -name "*.pyc" -delete 2>/dev/null || true

bundle:
	python $(SCRIPTS_DIR)/build_bundle.py

# PyPI publishing with auto-versioning
# Usage: make publish-pypi VERSION=0.2.0
# If VERSION is not set, it will bump the patch version automatically
publish-pypi: clean build  ## Publish to PyPI (set VERSION=x.y.z or auto-bump patch)
ifndef VERSION
	$(eval CURRENT := $(shell grep -m1 -Po '(?<=version = ")[^"]+' pyproject.toml))
	$(eval PARTS := $(subst ., ,$(CURRENT)))
	$(eval MAJOR := $(word 1,$(PARTS)))
	$(eval MINOR := $(word 2,$(PARTS)))
	$(eval PATCH := $(word 3,$(PARTS)))
	$(eval NEW_PATCH := $(shell echo $$(($(PATCH) + 1))))
	$(eval VERSION := $(MAJOR).$(MINOR).$(NEW_PATCH))
	@echo "Auto-bumping version: $(CURRENT) → $(VERSION)"
	sed -i 's/version = "$(CURRENT)"/version = "$(VERSION)"/' pyproject.toml
	sed -i 's/__version__ = "$(CURRENT)"/__version__ = "$(VERSION)"/' $(SRC_DIR)/$(PACKAGE)/__init__.py
	python -m build
endif
	@echo "Publishing version $(VERSION) to PyPI..."
	python -m twine upload dist/*

# =============================================================================
# Docker
# =============================================================================

docker-build:
	docker build -t $(DOCKER_IMAGE) .

docker-run:
	docker run -i --rm $(DOCKER_IMAGE)

# GHCR publishing
# Usage: make publish-ghcr VERSION=0.2.0
publish-ghcr: docker-build
ifndef VERSION
	$(error VERSION is required. Usage: make publish-ghcr VERSION=0.2.0)
endif
	docker tag $(DOCKER_IMAGE) $(GHCR_IMAGE):$(VERSION)
	docker tag $(DOCKER_IMAGE) $(GHCR_IMAGE):latest
	docker push $(GHCR_IMAGE):$(VERSION)
	docker push $(GHCR_IMAGE):latest

# =============================================================================
# Help
# =============================================================================

help:
	@echo "textual-docs-mcp — Makefile targets"
	@echo ""
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \
		awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-16s\033[0m %s\n", $$1, $$2}'
	@echo ""
	@echo "Examples:"
	@echo "  make dev                    # Install with dev dependencies"
	@echo "  make test                   # Run tests"
	@echo "  make check                  # Run all checks"
	@echo "  make publish-pypi           # Auto-bump patch and publish"
	@echo "  make publish-pypi VERSION=1.0.0  # Publish specific version"
	@echo "  make docker-build           # Build Docker image"
