.DEFAULT_GOAL := help

PYTHON ?= python3
VENV ?= .venv
VENV_PYTHON := $(VENV)/bin/python
HOST ?= 127.0.0.1
PORT ?= 8765

.PHONY: help setup setup-release generate example example-bitwise example-external lint lint-python lint-openapi test check build check-dist serve

help: ## Show available targets
	@awk 'BEGIN {FS = ":.*## "} /^[a-z-]+:.*## / {printf "  %-16s %s\n", $$1, $$2}' $(MAKEFILE_LIST)

$(VENV_PYTHON):
	$(PYTHON) -m venv "$(VENV)"

setup: $(VENV_PYTHON) ## Create the virtual environment and install the CLI and development dependencies
	"$(VENV_PYTHON)" -m pip install -r requirements-dev.txt
	"$(VENV_PYTHON)" -m pip install -e .

setup-release: setup ## Install development and release tooling
	"$(VENV_PYTHON)" -m pip install -r requirements-release.txt

generate: ## Generate JSON Schemas from the operator specification
	"$(VENV_PYTHON)" tools/generate_schema.py

example: ## Generate and validate the ready-to-run core extension example
	"$(VENV_PYTHON)" -m gramson generate --manifest examples/extension/language.yaml --output-directory build/examples/extension
	"$(VENV_PYTHON)" -m gramson validate examples/extension/expressions/nested.yaml --schema build/examples/extension/expression.schema.yaml
	"$(VENV_PYTHON)" -m gramson validate examples/extension/expressions/nested.json --schema build/examples/extension/expression.schema.yaml

example-bitwise: ## Generate and validate the bitwise extension example
	"$(VENV_PYTHON)" -m gramson generate --manifest examples/bitwise/language.yaml --output-directory build/examples/bitwise
	"$(VENV_PYTHON)" -m gramson validate examples/bitwise/expressions/nested.yaml --schema build/examples/bitwise/expression.schema.yaml
	"$(VENV_PYTHON)" -m gramson validate examples/bitwise/expressions/nested.json --schema build/examples/bitwise/expression.schema.yaml
	"$(VENV_PYTHON)" -m gramson validate examples/bitwise/expressions/conversions.yaml --schema build/examples/bitwise/expression.schema.yaml
	"$(VENV_PYTHON)" -m gramson validate examples/bitwise/expressions/conversions.json --schema build/examples/bitwise/expression.schema.yaml

example-external: ## Generate and validate an external namespace include
	"$(VENV_PYTHON)" -m gramson generate --manifest examples/external/language.yaml --spec-path examples/external/vendor --output-directory build/examples/external
	"$(VENV_PYTHON)" -m gramson validate examples/external/expressions/nested.yaml --schema build/examples/external/expression.schema.yaml
	"$(VENV_PYTHON)" -m gramson validate examples/external/expressions/nested.json --schema build/examples/external/expression.schema.yaml

lint: lint-python lint-openapi ## Run Python and OpenAPI linting

lint-python: ## Lint Python code and import ordering with Ruff
	"$(VENV_PYTHON)" -m ruff check .

lint-openapi: ## Validate the OpenAPI document and its external references
	"$(VENV_PYTHON)" -m openapi_spec_validator docs/openapi.yaml

test: ## Run all tests, including generated-schema freshness checks
	"$(VENV_PYTHON)" -m unittest discover -s tests -v

check: lint test ## Run lint and tests without regenerating files

build: ## Build a source distribution and a wheel from that source distribution
	"$(VENV_PYTHON)" -m build

check-dist: build ## Check package metadata, bundled schemas, and installed CLI
	"$(VENV_PYTHON)" tools/check_distribution.py dist

serve: generate ## Generate schemas and serve the Swagger viewer locally
	@printf 'Swagger viewer: http://%s:%s/docs/\n' "$(HOST)" "$(PORT)"
	"$(VENV_PYTHON)" -m http.server "$(PORT)" --bind "$(HOST)"
