# MarkiTect - Advanced Markdown Engine
# Makefile for common development tasks

.PHONY: help setup install test build clean update status dev lint format check-deps venv-status update-digest add-diary-entry list-issues show-issue list-open-issues create-issue close-issue close-issue-enhanced close-issues-batch test-from-issue tdd-start tdd-add-test tdd-finish tdd-status test-status test-new test-coverage test-arch test-foundation test-infrastructure test-integration test-domain test-service test-application test-presentation test-quick test-layers test-random test-random-seed test-random-repeat test-install-randomly test-clean test-tdd test-changed test-module test-cache-clean test-efficient cli-help release-status release-validate release-prepare release-build release-publish release-dry-run chaos-validate chaos-matrix chaos-inject chaos-report

# Default target
help:
	@echo "MarkiTect Development Commands"
	@echo "=============================="
	@echo ""
	@echo "Environment Status:"
	@$(MAKE) --no-print-directory venv-status
	@echo ""
	@echo "Setup & Installation:"
	@echo "  setup       - Initial project setup (venv + install)"
	@echo "  install     - Install package in development mode"
	@echo "  dev         - Install with development dependencies"
	@echo "  venv-status - Check if venv is active"
	@echo ""
	@echo "Development:"
	@echo "  test        - Run all tests"
	@echo "  test-status - Show test status summary without re-running"
	@echo "  test-new    - Create new test file template"
	@echo "  test-coverage ISSUE=X - Analyze test coverage for issue"
	@echo "  build       - Build the package"
	@echo "  lint        - Run code linting"
	@echo "  format      - Format code"
	@echo ""
	@echo "Release Management:"
	@echo "  release-status       - Show current release status"
	@echo "  release-validate     - Validate repository for release"
	@echo "  release-prepare VERSION=x.y.z - Prepare new release"
	@echo "  release-build        - Build release packages"
	@echo "  release-publish VERSION=x.y.z - Publish complete release"
	@echo "  release-dry-run VERSION=x.y.z - Test release preparation"
	@echo ""
	@echo "Chaos Engineering:"
	@echo "  chaos-validate       - Run architectural independence validation"
	@echo "  chaos-matrix         - Show dependency matrix"
	@echo "  chaos-inject LAYER=X TYPE=Y - Inject chaos into specific layer"
	@echo "  chaos-report         - Generate chaos engineering report"
	@echo ""
	@echo "Architectural Testing:"
	@echo "  test-arch           - Run all tests in architectural order"
	@echo "  test-foundation     - Run foundation layer tests only"
	@echo "  test-infrastructure - Run infrastructure layer tests only"
	@echo "  test-integration    - Run integration layer tests only"
	@echo "  test-domain         - Run domain layer tests only"
	@echo "  test-service        - Run service layer tests only"
	@echo "  test-application    - Run application layer tests only"
	@echo "  test-presentation   - Run presentation layer tests only"
	@echo "  test-quick          - Run foundation + infrastructure only (fast)"
	@echo "  test-layers         - List all architectural layers"
	@echo ""
	@echo "Randomized Testing:"
	@echo "  test-random         - Run tests in random order (dependency detection)"
	@echo "  test-random-seed SEED=X - Run with specific seed for reproducibility"
	@echo "  test-random-repeat NUM=X - Run multiple random iterations"
	@echo "  test-install-randomly    - Install pytest-randomly plugin"
	@echo ""
	@echo "Test Efficiency (Issue #57):"
	@echo "  test-clean      - Clean test run (exclude workspaces, fresh cache)"
	@echo "  test-tdd        - Quick TDD tests for fast feedback (<30s)"
	@echo "  test-changed    - Run tests for changed files only"
	@echo "  test-module MODULE=name - Run tests for specific module"
	@echo "  test-cache-clean - Clean pytest cache"
	@echo "  test-efficient  - Enhanced test suite (exclude workspaces)"
	@echo ""
	@echo "Maintenance:"
	@echo "  update      - Update from upstream (git + submodules)"
	@echo "  status      - Show git status for repo and submodules"
	@echo "  clean       - Clean build artifacts"
	@echo "  check-deps  - Check dependency status"
	@echo ""
	@echo "Documentation:"
	@echo "  update-digest   - Update ProjectStatusDigest.md (requires Claude Code)"
	@echo "  add-diary-entry - Add new entry to ProjectDiary.md (requires Claude Code)"
	@echo ""
	@echo "Issue Management:"
	@echo "  list-issues       - Show all gitea issues with status and priority"
	@echo "  list-open-issues  - Show only open issues (active backlog)"
	@echo "  create-issue TITLE='...' BODY='...' - Create a new issue (or BODY_FILE='/path/to/file.md')"
	@echo "  show-issue ISSUE=X (or NUM=X) - Show detailed view of specific issue"
	@echo "  close-issue ISSUE=X [COMMENT='reason'] - Close an issue and mark as completed"
	@echo "  close-issue-enhanced ISSUE=X [WORK='description'] - Close issue with enhanced functionality"
	@echo "  close-issues-batch NUMS='X Y Z' [COMMENT='reason'] - Close multiple issues at once"
	@echo "  issues-get        - Export compact issue index to ISSUES.index"
	@echo "  issues-csv        - Export issues as CSV for spreadsheet processing"
	@echo "  issues-json       - Export issues as JSON for programmatic processing"
	@echo "  issues-high       - Export only high/critical priority issues"
	@echo ""
	@echo "Test-Driven Development:"
	@echo "  test-from-issue ISSUE=X - Generate test skeleton from issue (requires Claude Code)"
	@echo ""
	@echo "TDD Workspace:"
	@echo "  tdd-start ISSUE=X     - Start working on issue (with requirements validation)"
	@echo "  tdd-add-test          - Add test to current issue workspace"
	@echo "  tdd-status            - Show current workspace state"
	@echo "  tdd-finish            - Complete issue work (moves tests to main)"
	@echo ""
	@echo "Requirements Engineering:"
	@echo "  validate-requirements - Analyze foundations before development"
	@echo "  check-interface-compatibility INTERFACE=Name - Check interface compatibility"
	@echo "  generate-dev-checklist FEATURE='Name' - Generate development checklist"
	@echo "  validate-mocks        - Validate mock object compatibility"
	@echo "  pre-commit-validate   - Complete pre-commit validation"
	@echo "  view-requirements-examples - Show usage examples"
	@echo ""
	@echo "MarkiTect CLI Usage:"
	@echo "  cli-help              - Show detailed CLI usage targets and examples"
	@echo "  cli-ingest [FILE=doc.md] - Process and store markdown files"
	@echo "  cli-workflow-basic    - Run complete basic workflow demo"
	@echo "  cli-workflow-schema FILE=doc.md - Run schema generation workflow"

# Python and virtual environment setup
PYTHON := python3
VENV := .venv
VENV_PYTHON := $(VENV)/bin/python
VENV_PIP := $(VENV)/bin/pip

# Check virtual environment status (read-only)
venv-status:
	@if [ -f $(VENV)/bin/activate ] && [ -f $(VENV)/bin/python ]; then \
		if [ -n "$$VIRTUAL_ENV" ] && [ "$$VIRTUAL_ENV" = "$$(realpath $(VENV))" ]; then \
			echo "  ✅ Virtual environment: Active in current shell"; \
		elif [ -n "$$VIRTUAL_ENV" ]; then \
			echo "  ⚠️  Virtual environment: Different venv active ($$VIRTUAL_ENV)"; \
			echo "     Run 'deactivate' then 'source $(VENV)/bin/activate'"; \
		else \
			echo "  📁 Virtual environment: Ready but not activated"; \
			echo "     Run 'source $(VENV)/bin/activate' to activate"; \
		fi; \
	else \
		echo "  ❌ Virtual environment: Not found"; \
		echo "     Run 'make setup' to create and configure"; \
	fi

# Setup virtual environment and install package
setup: $(VENV)/bin/activate install
	@echo "✅ Project setup complete!"

$(VENV)/bin/activate:
	@echo "🔧 Creating virtual environment..."
	$(PYTHON) -m venv $(VENV)
	$(VENV_PIP) install --upgrade pip setuptools wheel

# Install package in development mode
install: $(VENV)/bin/activate
	@echo "📦 Installing MarkiTect in development mode..."
	$(VENV_PIP) install -e .

# Install with development dependencies
dev: install
	@echo "🛠️  Installing development dependencies..."
	$(VENV_PIP) install pytest pytest-cov black flake8 mypy

# Run tests
test: $(VENV)/bin/activate
	@echo "🧪 Running tests..."
	@if [ -f $(VENV)/bin/pytest ]; then \
		PYTHONPATH=. $(VENV)/bin/pytest tests/ -v; \
	else \
		PYTHONPATH=. $(VENV_PYTHON) -m pytest tests/ -v 2>/dev/null || \
		PYTHONPATH=. $(VENV_PYTHON) -m unittest discover tests/ -v; \
	fi

# TDD8 Workflow Optimized Test Targets (Issue #57)

# Fast test execution for TDD red phase
test-red: $(VENV)/bin/activate
	@echo "🔴 TDD Red Phase - Fast test execution..."
	PYTHONPATH=. $(VENV_PYTHON) -m pytest tests/ -x --maxfail=1 --tb=short -q

# Comprehensive test execution for TDD green phase
test-green: $(VENV)/bin/activate
	@echo "🟢 TDD Green Phase - Comprehensive validation..."
	PYTHONPATH=. $(VENV_PYTHON) -m pytest tests/ --tb=short

# Smart test selection - changed files only
test-smart: $(VENV)/bin/activate
	@echo "🧠 Smart test selection - changed files only..."
	@changed_tests=$$(git diff --name-only HEAD~1 | grep test_ | tr '\n' ' '); \
	if [ -n "$$changed_tests" ]; then \
		PYTHONPATH=. $(VENV_PYTHON) -m pytest $$changed_tests -v; \
	else \
		echo "No test files changed, running fast subset"; \
		$(MAKE) test-fast; \
	fi

# Ultra-fast test execution
test-ultra-fast: $(VENV)/bin/activate
	@echo "⚡ Ultra-fast test execution..."
	PYTHONPATH=. $(VENV_PYTHON) -m pytest tests/ -m "not slow" --maxfail=1 -x -q

# Test with performance monitoring
test-perf: $(VENV)/bin/activate
	@echo "📊 Test execution with performance monitoring..."
	PYTHONPATH=. $(VENV_PYTHON) -m pytest tests/ --durations=10 --tb=short

# Test health check
test-health: $(VENV)/bin/activate
	@echo "🏥 Test infrastructure health check..."
	@PYTHONPATH=. $(VENV_PYTHON) tools/testing_efficiency_optimizer.py diagnose

# Clean all test caches (Enhanced for Issue #57)
test-cache-clean-enhanced: $(VENV)/bin/activate
	@echo "🧹 Enhanced cache cleaning..."
	find . -name '.pytest_cache' -type d -exec rm -rf {} + 2>/dev/null || true
	find . -name '__pycache__' -type d -exec rm -rf {} + 2>/dev/null || true
	find . -name '*.pyc' -delete 2>/dev/null || true

# Build the package
build: $(VENV)/bin/activate
	@echo "🏗️  Building package..."
	$(VENV_PYTHON) -m build 2>/dev/null || \
	$(VENV_PIP) install build && $(VENV_PYTHON) -m build

# Release management
release-status:
	@echo "🔍 Checking release status..."
	$(VENV_PYTHON) release.py status

release-validate:
	@echo "✅ Validating release readiness..."
	$(VENV_PYTHON) release.py validate

release-prepare:
	@echo "🚀 Preparing release..."
	@if [ -z "$(VERSION)" ]; then \
		echo "❌ Usage: make release-prepare VERSION=1.0.0"; \
		exit 1; \
	fi
	$(VENV_PYTHON) release.py prepare --version $(VERSION)

release-build:
	@echo "📦 Building release packages..."
	$(VENV_PYTHON) release.py build $(if $(VERSION),--version $(VERSION))

release-publish:
	@echo "📢 Publishing release..."
	@if [ -z "$(VERSION)" ]; then \
		echo "❌ Usage: make release-publish VERSION=1.0.0"; \
		exit 1; \
	fi
	$(VENV_PYTHON) release.py publish --version $(VERSION)

release-dry-run:
	@echo "🧪 Dry run release preparation..."
	@if [ -z "$(VERSION)" ]; then \
		echo "❌ Usage: make release-dry-run VERSION=1.0.0"; \
		exit 1; \
	fi
	$(VENV_PYTHON) release.py prepare --version $(VERSION) --dry-run

# Chaos Engineering targets
chaos-validate:
	@echo "🔥 Running architectural independence validation..."
	$(VENV_PYTHON) tools/chaos_test_runner.py validate-independence

chaos-matrix:
	@echo "🏗️  Showing architectural dependency matrix..."
	$(VENV_PYTHON) tools/chaos_test_runner.py dependency-matrix

chaos-inject:
	@echo "💥 Injecting chaos into layer..."
	@if [ -z "$(LAYER)" ]; then \
		echo "❌ Usage: make chaos-inject LAYER=L1_Presentation TYPE=import_failure"; \
		exit 1; \
	fi
	$(VENV_PYTHON) tools/chaos_test_runner.py inject-layer-failure --layer $(LAYER) $(if $(TYPE),--injection-type $(TYPE))

chaos-report:
	@echo "📄 Generating chaos engineering report..."
	$(VENV_PYTHON) tools/chaos_test_runner.py chaos-report

# Code linting
lint: $(VENV)/bin/activate
	@echo "🔍 Running linting..."
	@if [ -f $(VENV)/bin/flake8 ]; then \
		$(VENV)/bin/flake8 markitect/ tests/; \
	else \
		echo "⚠️  flake8 not installed. Run 'make dev' first."; \
	fi

# Code formatting
format: $(VENV)/bin/activate
	@echo "✨ Formatting code..."
	@if [ -f $(VENV)/bin/black ]; then \
		$(VENV)/bin/black markitect/ tests/; \
	else \
		echo "⚠️  black not installed. Run 'make dev' first."; \
	fi

# Update from upstream
update:
	@echo "🔄 Updating from upstream..."
	@git status --porcelain | grep -q . && echo "⚠️  Working directory not clean. Commit or stash changes first." && exit 1 || true
	git pull origin main
	git submodule update --remote
	@if git status --porcelain | grep -q "wiki"; then \
		echo "📝 Committing wiki submodule update..."; \
		git add wiki; \
		git commit -m "Update wiki submodule to latest"; \
	fi
	@echo "✅ Update complete!"

# Show git status
status:
	@echo "📊 Repository Status"
	@echo "==================="
	@echo ""
	@echo "Main Repository:"
	git status --short
	@echo ""
	@echo "Wiki Submodule:"
	@cd wiki && git status --short
	@echo ""
	@echo "Recent Commits:"
	git log --oneline -5

# Clean build artifacts
clean:
	@echo "🧹 Cleaning build artifacts..."
	rm -rf build/
	rm -rf dist/
	rm -rf *.egg-info/
	find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
	find . -name "*.pyc" -delete 2>/dev/null || true
	@echo "✅ Clean complete!"

# Check dependency status
check-deps: $(VENV)/bin/activate
	@echo "📋 Dependency Status"
	@echo "==================="
	@echo ""
	@echo "Python version:"
	$(VENV_PYTHON) --version
	@echo ""
	@echo "Installed packages:"
	$(VENV_PIP) list
	@echo ""
	@echo "Project dependencies:"
	$(VENV_PIP) check

# Update project status digest (requires Claude Code)
update-digest:
	@echo "🔍 Checking for Claude Code availability..."
	@if ! command -v claude >/dev/null 2>&1; then \
		echo "❌ Claude Code not found in PATH"; \
		echo "   This target requires Claude Code CLI to be installed"; \
		echo "   Visit: https://claude.ai/code for installation instructions"; \
		exit 1; \
	fi
	@echo "✅ Claude Code found"
	@echo "📝 Updating ProjectStatusDigest.md..."
	@echo "   Please ask Claude Code to update the project digest based on current state"
	@echo "   Command: 'Please update ProjectStatusDigest.md with the current project state'"
	@echo ""
	@echo "💡 Tip: You can also manually edit ProjectStatusDigest.md if needed"

# Add new entry to project diary (requires Claude Code)
add-diary-entry:
	@echo "🔍 Checking for Claude Code availability..."
	@if ! command -v claude >/dev/null 2>&1; then \
		echo "❌ Claude Code not found in PATH"; \
		echo "   This target requires Claude Code CLI to be installed"; \
		echo "   Visit: https://claude.ai/code for installation instructions"; \
		exit 1; \
	fi
	@echo "✅ Claude Code found"
	@if [ ! -f ProjectDiary.md ]; then \
		echo "❌ ProjectDiary.md not found"; \
		echo "   Create the diary file first or run this from the project root"; \
		exit 1; \
	fi
	@echo "📖 Adding new entry to ProjectDiary.md..."
	@echo "   Please ask Claude Code to add a new diary entry for recent work"
	@echo "   Command: 'Please add a new entry to ProjectDiary.md summarizing recent progress'"
	@echo ""
	@echo "📋 Entry should include:"
	@echo "   - Date ($(shell date +%Y-%m-%d))"
	@echo "   - One-line progress characterization"
	@echo "   - Contributors since last entry"
	@echo "   - Time estimate and AI token usage"
	@echo "   - One paragraph work summary"
	@echo ""
	@echo "💡 Tip: New entries are added to the top for reverse chronological order"

# Git repository and API configuration
GITEA_URL := http://92.205.130.254:32166
REPO_OWNER := coulomb
REPO_NAME := markitect_project
ISSUES_API := $(GITEA_URL)/api/v1/repos/$(REPO_OWNER)/$(REPO_NAME)/issues

# Issue workspace configuration
WORKSPACE_DIR := .markitect_workspace
CURRENT_ISSUE_FILE := $(WORKSPACE_DIR)/current_issue.json

# List all gitea issues
list-issues: $(VENV)/bin/activate
	@PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py list-issues

# Show detailed view of a specific issue
show-issue: $(VENV)/bin/activate
	@ISSUE_NUM=""; \
	if [ -n "$(ISSUE)" ]; then \
		ISSUE_NUM="$(ISSUE)"; \
	elif [ -n "$(NUM)" ]; then \
		ISSUE_NUM="$(NUM)"; \
	fi; \
	if [ -z "$$ISSUE_NUM" ]; then \
		echo "❌ Please specify issue number: make show-issue ISSUE=5 (or NUM=5)"; \
		exit 1; \
	fi; \
	PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py show-issue $$ISSUE_NUM

# List only open issues (active backlog)
list-open-issues: $(VENV)/bin/activate
	@PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py list-open-issues

# Create a new issue
create-issue:
	@if [ -z "$(TITLE)" ]; then \
		echo "❌ Please specify issue title: make create-issue TITLE='Fix bug' BODY='Description'"; \
		echo "❌ Or use: make create-issue TITLE='Fix bug' BODY_FILE='/path/to/body.md'"; \
		exit 1; \
	fi
	@if [ -z "$(BODY)" ] && [ -z "$(BODY_FILE)" ]; then \
		echo "❌ Please specify either BODY='...' or BODY_FILE='/path/to/file.md'"; \
		exit 1; \
	fi
	@echo "📋 Creating new issue..."
	@echo "📋 Title: $(TITLE)"
	@if [ -n "$(BODY_FILE)" ]; then \
		tea issue create --title "$(TITLE)" --description "$$(cat $(BODY_FILE))"; \
	else \
		tea issue create --title "$(TITLE)" --description "$(BODY)"; \
	fi

# Close an issue and mark as completed
close-issue: $(VENV)/bin/activate
	@ISSUE_NUM=""; \
	if [ -n "$(ISSUE)" ]; then \
		ISSUE_NUM="$(ISSUE)"; \
	elif [ -n "$(NUM)" ]; then \
		ISSUE_NUM="$(NUM)"; \
	fi; \
	if [ -z "$$ISSUE_NUM" ]; then \
		echo "❌ Please specify issue number: make close-issue ISSUE=5 (or NUM=5)"; \
		exit 1; \
	fi; \
	if [ -n "$(COMMENT)" ]; then \
		echo "🔄 Closing issue #$$ISSUE_NUM with comment..."; \
		PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py close-issue $$ISSUE_NUM --comment "$(COMMENT)"; \
	else \
		echo "🔄 Closing issue #$$ISSUE_NUM..."; \
		PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py close-issue $$ISSUE_NUM; \
	fi; \
	echo "✅ Issue #$$ISSUE_NUM closed successfully!"

# Close issue using dedicated issue_closer.py script (enhanced functionality)
close-issue-enhanced: $(VENV)/bin/activate
	@ISSUE_NUM=""; \
	if [ -n "$(ISSUE)" ]; then \
		ISSUE_NUM="$(ISSUE)"; \
	elif [ -n "$(NUM)" ]; then \
		ISSUE_NUM="$(NUM)"; \
	fi; \
	if [ -z "$$ISSUE_NUM" ]; then \
		echo "❌ Please specify issue number: make close-issue-enhanced ISSUE=5 (or NUM=5)"; \
		exit 1; \
	fi; \
	if [ -n "$(WORK)" ]; then \
		echo "🔄 Closing issue #$$ISSUE_NUM with completion message..."; \
		PYTHONPATH=. $(VENV_PYTHON) tddai/issue_closer.py $$ISSUE_NUM --work-completed "$(WORK)"; \
	elif [ -n "$(COMMENT)" ]; then \
		echo "🔄 Closing issue #$$ISSUE_NUM with comment..."; \
		PYTHONPATH=. $(VENV_PYTHON) tddai/issue_closer.py $$ISSUE_NUM --comment "$(COMMENT)"; \
	else \
		echo "🔄 Closing issue #$$ISSUE_NUM..."; \
		PYTHONPATH=. $(VENV_PYTHON) tddai/issue_closer.py $$ISSUE_NUM; \
	fi

# Close multiple issues at once using issue_closer.py
close-issues-batch: $(VENV)/bin/activate
	@if [ -z "$(NUMS)" ]; then \
		echo "❌ Please specify issue numbers: make close-issues-batch NUMS='42 43 44'"; \
		exit 1; \
	fi
	@if [ -n "$(COMMENT)" ]; then \
		echo "🔄 Closing issues $(NUMS) with comment..."; \
		PYTHONPATH=. $(VENV_PYTHON) tddai/issue_closer.py $(NUMS) --comment "$(COMMENT)"; \
	else \
		echo "🔄 Closing issues $(NUMS)..."; \
		PYTHONPATH=. $(VENV_PYTHON) tddai/issue_closer.py $(NUMS); \
	fi

# Export compact issue index to ISSUES.index file (TSV format)
issues-get: $(VENV)/bin/activate
	@echo "📋 Fetching issue index from gitea..."
	@PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py issue-index --format tsv --sort number > ISSUES.index
	@echo "✅ Issue index exported to ISSUES.index (TSV format)"
	@echo "📄 File contents:"
	@cat ISSUES.index

# Export issues as CSV for spreadsheet processing
issues-csv: $(VENV)/bin/activate
	@echo "📊 Exporting issues as CSV..."
	@PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py issue-index --format csv --sort priority --include-state > ISSUES.csv
	@echo "✅ Issues exported to ISSUES.csv"
	@wc -l ISSUES.csv | awk '{print "📄 Total entries:", $$1-1, "(excluding header)"}'

# Export issues as JSON for programmatic processing
issues-json: $(VENV)/bin/activate
	@echo "🔧 Exporting issues as JSON..."
	@PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py issue-index --format json --sort priority > ISSUES.json
	@echo "✅ Issues exported to ISSUES.json"
	@echo "📄 Sample entry:"
	@head -20 ISSUES.json

# Export only high and critical priority issues
issues-high: $(VENV)/bin/activate
	@echo "🚨 Exporting high priority issues..."
	@echo "High priority issues:" > ISSUES.high.txt
	@PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py issue-index --format tsv --filter-priority high --sort number >> ISSUES.high.txt
	@echo "" >> ISSUES.high.txt
	@echo "Critical priority issues:" >> ISSUES.high.txt
	@PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py issue-index --format tsv --filter-priority critical --sort number >> ISSUES.high.txt
	@echo "✅ High priority issues exported to ISSUES.high.txt"
	@cat ISSUES.high.txt

# Generate test skeleton from gitea issue (requires Claude Code)
test-from-issue:
	@ISSUE_NUM=""; \
	if [ -n "$(ISSUE)" ]; then \
		ISSUE_NUM="$(ISSUE)"; \
	elif [ -n "$(NUM)" ]; then \
		ISSUE_NUM="$(NUM)"; \
	fi; \
	if [ -z "$$ISSUE_NUM" ]; then \
		echo "❌ Please specify issue number: make test-from-issue ISSUE=1 (or NUM=1)"; \
		exit 1; \
	fi
	@echo "🔍 Checking for Claude Code availability..."
	@if ! command -v claude >/dev/null 2>&1; then \
		echo "❌ Claude Code not found in PATH"; \
		echo "   This target requires Claude Code CLI to be installed"; \
		echo "   Visit: https://claude.ai/code for installation instructions"; \
		exit 1; \
	fi
	@echo "✅ Claude Code found"
	@echo "🔍 Checking for curl..."
	@if ! command -v curl >/dev/null 2>&1; then \
		echo "❌ curl not found - required for API access"; \
		exit 1; \
	fi
	@echo "✅ curl found"
	@echo "📋 Fetching issue #$$ISSUE_NUM details..."
	@curl -s "$(ISSUES_API)/$$ISSUE_NUM" | jq -r 'if .title then "✅ Issue #'"$$ISSUE_NUM"': " + .title + "\n\n🧪 Generating test skeleton...\n   Please ask Claude Code to generate a test for this issue:\n\n   Command: '"'"'Generate a test skeleton for issue #'"$$ISSUE_NUM"''"'"'\n\n📋 Issue Details:\n   Title: " + .title + "\n   Description: " + .body + "\n\n📝 Test Requirements:\n   - Follow TDD principles (test first, then implementation)\n   - Use pytest framework (existing project convention)\n   - Place test in tests/ directory\n   - Name test file: test_issue_'"$$ISSUE_NUM"'_*.py\n   - Include docstring referencing issue #'"$$ISSUE_NUM"'\n   - Test should initially fail (red state)\n\n💡 After generation, run '"'"'make test'"'"' to verify test fails initially" else "❌ Issue #'"$$ISSUE_NUM"' not found or API error\n   Use '"'"'make list-open-issues'"'"' to see available issues" end' 2>/dev/null || echo "❌ Issue #$$ISSUE_NUM not found or API error"

# Start working on an issue (creates workspace with requirements validation)
tdd-start: validate-requirements $(VENV)/bin/activate
	@ISSUE_NUM=""; \
	if [ -n "$(ISSUE)" ]; then \
		ISSUE_NUM="$(ISSUE)"; \
	elif [ -n "$(NUM)" ]; then \
		ISSUE_NUM="$(NUM)"; \
	fi; \
	if [ -z "$$ISSUE_NUM" ]; then \
		echo "❌ Please specify issue number: make tdd-start ISSUE=1 (or NUM=1)"; \
		exit 1; \
	fi; \
	echo "🚀 Starting TDD workflow with requirements validation..."; \
	PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py start-issue $$ISSUE_NUM

# Add test to current issue workspace
tdd-add-test: $(VENV)/bin/activate
	@PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py add-test

# Show current workspace status
tdd-status: $(VENV)/bin/activate
	@PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py workspace-status

# Complete issue work (move tests to main and cleanup)
tdd-finish: $(VENV)/bin/activate
	@PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py finish-issue

# Show test status summary without re-running tests
test-status: $(VENV)/bin/activate
	@echo "📊 MarkiTect Test Status Summary"
	@echo "==============================="
	@echo ""
	@echo "📄 Test Files:"
	@find tests/ -name "test_*.py" -exec basename {} \; | sort | sed 's/^/   📝 /'
	@echo ""
	@echo "📊 Quick Stats:"
	@echo -n "   Total test files: "
	@find tests/ -name "test_*.py" | wc -l
	@echo ""
	@if [ -f ".pytest_cache/CACHEDIR.TAG" ]; then \
		echo "💾 Last Test Results (cached):"; \
		if [ -f ".pytest_cache/v/cache/lastfailed" ]; then \
			echo "   ❌ Recent failures detected"; \
			echo -n "   Failed tests: "; \
			cat .pytest_cache/v/cache/lastfailed | jq -r 'keys[]' 2>/dev/null | wc -l || echo "Unknown"; \
		else \
			echo "   ✅ No recent failures in cache"; \
		fi; \
		echo "   📁 Cache: .pytest_cache/ ($$(du -sh .pytest_cache/ 2>/dev/null | cut -f1 || echo 'Unknown size'))"; \
		if [ -f ".pytest_cache/README.md" ]; then \
			echo "   📅 Last run: $$(stat -c %y .pytest_cache/README.md 2>/dev/null | cut -d. -f1 || echo 'Unknown')"; \
		fi; \
	else \
		echo "❓ No test cache found - run 'make test' to generate results"; \
	fi
	@echo ""
	@echo "🔍 For detailed status:"
	@echo "   make test           # Run all tests with full output"
	@echo "   make test 2>&1 | grep -E 'PASSED|FAILED'  # Show only results"
	@echo ""
	@if [ -f "test_status_report.md" ]; then \
		echo "📋 Full Status Report: test_status_report.md"; \
		echo "   Last updated: $$(stat -c %y test_status_report.md 2>/dev/null || echo 'Unknown')"; \
	else \
		echo "💡 Generate detailed report with test run data"; \
	fi

# Create new test file template
test-new: $(VENV)/bin/activate
	@echo "🧪 Creating new test file"
	@echo "========================"
	@echo ""
	@read -p "Test name (e.g., feature_name): " test_name; \
	if [ -z "$$test_name" ]; then \
		echo "❌ Test name cannot be empty"; \
		exit 1; \
	fi; \
	test_file="tests/test_$$test_name.py"; \
	if [ -f "$$test_file" ]; then \
		echo "❌ Test file already exists: $$test_file"; \
		exit 1; \
	fi; \
	echo "📝 Creating: $$test_file"; \
	echo '"""' > "$$test_file"; \
	echo "Test for $$test_name functionality." >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	echo "This test module validates [describe what you're testing]." >> "$$test_file"; \
	echo '"""' >> "$$test_file"; \
	echo "import pytest" >> "$$test_file"; \
	echo "from markitect import [import what you need]" >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	class_name=$$(echo $$test_name | sed 's/_/ /g' | sed 's/\b\w/\U&/g' | sed 's/ //g'); \
	echo "class Test$$class_name:" >> "$$test_file"; \
	echo '    """Test suite for '$$test_name' functionality."""' >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	echo "    def setup_method(self):" >> "$$test_file"; \
	echo '        """Set up test environment."""' >> "$$test_file"; \
	echo "        pass" >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	echo "    def teardown_method(self):" >> "$$test_file"; \
	echo '        """Clean up after tests."""' >> "$$test_file"; \
	echo "        pass" >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	echo "    def test_basic_functionality(self):" >> "$$test_file"; \
	echo '        """Test basic '$$test_name' functionality."""' >> "$$test_file"; \
	echo "        # Arrange" >> "$$test_file"; \
	echo "        # TODO: Set up test data" >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	echo "        # Act" >> "$$test_file"; \
	echo "        # TODO: Execute the functionality" >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	echo "        # Assert" >> "$$test_file"; \
	echo "        # TODO: Verify expected results" >> "$$test_file"; \
	echo "        assert True  # Replace with actual assertions" >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	echo "    def test_edge_cases(self):" >> "$$test_file"; \
	echo '        """Test edge cases for '$$test_name'."""' >> "$$test_file"; \
	echo "        # TODO: Test boundary conditions, empty inputs, etc." >> "$$test_file"; \
	echo "        pass" >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	echo "    def test_error_handling(self):" >> "$$test_file"; \
	echo '        """Test error handling for '$$test_name'."""' >> "$$test_file"; \
	echo "        # TODO: Test invalid inputs, exception cases" >> "$$test_file"; \
	echo "        pass" >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	echo "" >> "$$test_file"; \
	echo "if __name__ == '__main__':" >> "$$test_file"; \
	echo "    pytest.main([__file__, '-v'])" >> "$$test_file"; \
	echo "✅ Test file created: $$test_file"; \
	echo ""; \
	echo "🎯 Next steps:"; \
	echo "   1. Edit the test file to add your specific tests"; \
	echo "   2. Run: make test to check if it works"; \
	echo "   3. Implement the actual functionality"; \
	echo "   4. Run tests again to verify (TDD cycle)"

# Analyze test coverage for a specific issue
test-coverage: $(VENV)/bin/activate
	@ISSUE_NUM=""; \
	if [ -n "$(ISSUE)" ]; then \
		ISSUE_NUM="$(ISSUE)"; \
	elif [ -n "$(NUM)" ]; then \
		ISSUE_NUM="$(NUM)"; \
	fi; \
	if [ -z "$$ISSUE_NUM" ]; then \
		echo "❌ Please specify issue number: make test-coverage ISSUE=5 (or NUM=5)"; \
		exit 1; \
	fi; \
	PYTHONPATH=. $(VENV_PYTHON) tddai_cli.py analyze-coverage $$ISSUE_NUM

# ============================================================================
# Architectural Testing Targets
# ============================================================================

# Run all tests in architectural order (reverse dependency)
test-arch: $(VENV)/bin/activate
	@echo "🏗️  Running architectural test suite in reverse dependency order..."
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py

# Run foundation layer tests only (Layer 7 - fastest feedback)
test-foundation: $(VENV)/bin/activate
	@echo "🏢 Running Foundation Layer tests (Layer 7)..."
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py --layer foundation

# Run infrastructure layer tests only (Layer 5 - technical capabilities)
test-infrastructure: $(VENV)/bin/activate
	@echo "🔧 Running Infrastructure Layer tests (Layer 5)..."
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py --layer infrastructure

# Run integration layer tests only (Layer 6 - external systems)
test-integration: $(VENV)/bin/activate
	@echo "🌐 Running Integration Layer tests (Layer 6)..."
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py --layer integration

# Run domain layer tests only (Layer 3 - business logic)
test-domain: $(VENV)/bin/activate
	@echo "🏛️  Running Domain Layer tests (Layer 3)..."
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py --layer domain

# Run service layer tests only (Layer 4 - application services)
test-service: $(VENV)/bin/activate
	@echo "⚙️  Running Service Layer tests (Layer 4)..."
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py --layer service

# Run application layer tests only (Layer 2 - use cases & workflows)
test-application: $(VENV)/bin/activate
	@echo "🚀 Running Application Layer tests (Layer 2)..."
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py --layer application

# Run presentation layer tests only (Layer 1 - user interface)
test-presentation: $(VENV)/bin/activate
	@echo "🎯 Running Presentation Layer tests (Layer 1)..."
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py --layer presentation

# Run foundation + infrastructure only (quick feedback)
test-quick: $(VENV)/bin/activate
	@echo "⚡ Running quick test suite (Foundation + Infrastructure)..."
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py --quick

# List all architectural layers and their test files
test-layers: $(VENV)/bin/activate
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py --list-layers

# Advanced architectural testing options
test-arch-verbose: $(VENV)/bin/activate
	@echo "🏗️  Running architectural test suite with verbose output..."
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py --verbose

test-arch-continue: $(VENV)/bin/activate
	@echo "🏗️  Running architectural test suite (continue on failures)..."
	@PYTHONPATH=src $(VENV_PYTHON) run_architectural_tests.py --continue-on-failure

# Update .PHONY for advanced targets
.PHONY: test-arch-verbose test-arch-continue

# ============================================================================
# Randomized Testing Targets
# ============================================================================

# Run tests in random order to detect hidden dependencies
test-random: $(VENV)/bin/activate
	@echo "🎲 Running tests in randomized order..."
	@PYTHONPATH=src $(VENV_PYTHON) run_randomized_tests.py

# Run tests with specific seed for reproducibility
test-random-seed: $(VENV)/bin/activate
	@if [ -z "$(SEED)" ]; then \
		echo "❌ Please specify seed: make test-random-seed SEED=12345"; \
		exit 1; \
	fi
	@echo "🎲 Running tests with seed $(SEED)..."
	@PYTHONPATH=src $(VENV_PYTHON) run_randomized_tests.py --seed $(SEED)

# Run multiple random iterations to find flaky tests
test-random-repeat: $(VENV)/bin/activate
	@if [ -z "$(NUM)" ]; then \
		echo "❌ Please specify number of iterations: make test-random-repeat NUM=5"; \
		exit 1; \
	fi
	@echo "🔄 Running $(NUM) randomized test iterations..."
	@PYTHONPATH=src $(VENV_PYTHON) run_randomized_tests.py --repeat $(NUM)

# Install pytest-randomly plugin for enhanced randomization
test-install-randomly: $(VENV)/bin/activate
	@echo "📦 Installing pytest-randomly plugin..."
	@$(VENV_PIP) install pytest-randomly
	@echo "✅ pytest-randomly installed - now supports within-file randomization"
	@echo "💡 Use --shuffle-within-file flag for enhanced randomization"

# Advanced randomized testing options
test-random-verbose: $(VENV)/bin/activate
	@echo "🎲 Running randomized tests with verbose output..."
	@PYTHONPATH=src $(VENV_PYTHON) run_randomized_tests.py --verbose

test-random-enhanced: $(VENV)/bin/activate
	@echo "🎲 Running enhanced randomized tests (within-file shuffling)..."
	@PYTHONPATH=src $(VENV_PYTHON) run_randomized_tests.py --shuffle-within-file --verbose

# Update .PHONY for randomized targets
.PHONY: test-random-verbose test-random-enhanced

# ============================================================================
# Test Efficiency Targets (Issue #57)
# ============================================================================

# Clean test runner that excludes workspace directories and cleans cache
test-clean: $(VENV)/bin/activate
	@echo "🧹 Running clean test suite (excluding workspaces, fresh cache)..."
	@echo "   Cleaning pytest cache..."
	@rm -rf .pytest_cache/
	@echo "   Running tests with workspace exclusion..."
	@PYTHONPATH=. $(VENV_PYTHON) -m pytest tests/ -v \
		--ignore=.markitect_workspace/ \
		--cache-clear \
		--tb=short

# Quick test suite for TDD workflows (fast feedback)
test-tdd: $(VENV)/bin/activate
	@echo "⚡ Running TDD test suite for fast feedback..."
	@PYTHONPATH=. $(VENV_PYTHON) -m pytest tests/ \
		--ignore=.markitect_workspace/ \
		-x \
		--tb=line \
		-q \
		-m "not slow and not integration and not e2e"

# Run tests for changed files only (intelligent selection)
test-changed: $(VENV)/bin/activate
	@echo "🎯 Running tests for changed files..."
	@if git diff --name-only HEAD~1 | grep -E "\.(py)$$" >/dev/null 2>&1; then \
		echo "   Detected Python file changes"; \
		changed_files=$$(git diff --name-only HEAD~1 | grep -E "\.(py)$$" | tr '\n' ' '); \
		echo "   Changed files: $$changed_files"; \
		PYTHONPATH=. $(VENV_PYTHON) -m pytest \
			--ignore=.markitect_workspace/ \
			-v \
			--tb=short; \
	else \
		echo "   No Python file changes detected"; \
		echo "   Running smoke tests instead..."; \
		PYTHONPATH=. $(VENV_PYTHON) -m pytest tests/ \
			--ignore=.markitect_workspace/ \
			-m "smoke" \
			-q; \
	fi

# Run tests for a specific module
test-module: $(VENV)/bin/activate
	@if [ -z "$(MODULE)" ]; then \
		echo "❌ Please specify module: make test-module MODULE=markitect.cli"; \
		exit 1; \
	fi
	@echo "🎯 Running tests for module: $(MODULE)..."
	@PYTHONPATH=. $(VENV_PYTHON) -m pytest tests/ \
		--ignore=.markitect_workspace/ \
		-k "$(MODULE)" \
		-v \
		--tb=short

# Clean up stale cache entries
test-cache-clean: $(VENV)/bin/activate
	@echo "🧹 Cleaning test cache..."
	@if [ -d ".pytest_cache" ]; then \
		echo "   Removing pytest cache directory..."; \
		rm -rf .pytest_cache/; \
		echo "   ✅ Cache cleaned"; \
	else \
		echo "   ✅ No cache to clean"; \
	fi

# Enhanced test command with workspace exclusion (replace default test)
test-efficient: $(VENV)/bin/activate
	@echo "🧪 Running efficient test suite (excluding workspaces)..."
	@PYTHONPATH=. $(VENV_PYTHON) -m pytest tests/ \
		--ignore=.markitect_workspace/ \
		-v \
		--tb=short \
		--maxfail=5

.PHONY: test-clean test-tdd test-changed test-module test-cache-clean test-efficient

# ============================================================================
# MarkiTect CLI Usage Targets
# ============================================================================

# Variables for CLI targets
MARKITECT := PYTHONPATH=. $(VENV_PYTHON) -c "from markitect.cli import cli; import sys; cli(sys.argv[1:])"
SAMPLE_DOC := test_frontmatter.md
OUTPUT_FORMAT := table

# Basic document operations
cli-ingest: $(VENV)/bin/activate
	@if [ -z "$(FILE)" ]; then \
		echo "📄 Processing sample document..."; \
		$(MARKITECT) ingest $(SAMPLE_DOC); \
	else \
		echo "📄 Processing document: $(FILE)"; \
		$(MARKITECT) ingest $(FILE); \
	fi

cli-status: $(VENV)/bin/activate
	@if [ -z "$(FILE)" ]; then \
		echo "📊 Checking status of sample document..."; \
		$(MARKITECT) status $(SAMPLE_DOC); \
	else \
		echo "📊 Checking status of document: $(FILE)"; \
		$(MARKITECT) status $(FILE); \
	fi

cli-list: $(VENV)/bin/activate
	@echo "📋 Listing all processed documents..."
	@$(MARKITECT) list --format $(OUTPUT_FORMAT)

cli-get: $(VENV)/bin/activate
	@if [ -z "$(FILE)" ]; then \
		echo "📖 Retrieving sample document..."; \
		$(MARKITECT) get $(SAMPLE_DOC); \
	else \
		echo "📖 Retrieving document: $(FILE)"; \
		$(MARKITECT) get $(FILE); \
	fi

# Schema operations
cli-schema-generate: $(VENV)/bin/activate
	@if [ -z "$(FILE)" ]; then \
		echo "🔧 Generating schema from sample document..."; \
		$(MARKITECT) schema-generate $(SAMPLE_DOC) --format json; \
	else \
		echo "🔧 Generating schema from document: $(FILE)"; \
		$(MARKITECT) schema-generate $(FILE) --format json; \
	fi

cli-schema-ingest: $(VENV)/bin/activate
	@if [ -z "$(SCHEMA)" ]; then \
		echo "❌ Usage: make cli-schema-ingest SCHEMA=schema.json"; \
		echo "   Example: make cli-schema-ingest SCHEMA=my_schema.json"; \
		exit 1; \
	fi
	@echo "📥 Ingesting schema: $(SCHEMA)"
	@$(MARKITECT) schema-ingest $(SCHEMA)

cli-schema-list: $(VENV)/bin/activate
	@echo "📋 Listing stored schemas..."
	@$(MARKITECT) schema-list --format $(OUTPUT_FORMAT)

cli-schema-get: $(VENV)/bin/activate
	@if [ -z "$(SCHEMA)" ]; then \
		echo "❌ Usage: make cli-schema-get SCHEMA=schema_name"; \
		echo "   Example: make cli-schema-get SCHEMA=my_schema.json"; \
		exit 1; \
	fi
	@echo "📖 Retrieving schema: $(SCHEMA)"
	@$(MARKITECT) schema-get $(SCHEMA)

cli-validate: $(VENV)/bin/activate
	@if [ -z "$(FILE)" ] || [ -z "$(SCHEMA)" ]; then \
		echo "❌ Usage: make cli-validate FILE=document.md SCHEMA=schema.json"; \
		echo "   Example: make cli-validate FILE=test_frontmatter.md SCHEMA=generated_schema.json"; \
		exit 1; \
	fi
	@echo "✅ Validating $(FILE) against $(SCHEMA)..."
	@$(MARKITECT) validate $(FILE) $(SCHEMA)

cli-validate-detailed: $(VENV)/bin/activate
	@if [ -z "$(FILE)" ] || [ -z "$(SCHEMA)" ]; then \
		echo "❌ Usage: make cli-validate-detailed FILE=document.md SCHEMA=schema.json"; \
		echo "   Example: make cli-validate-detailed FILE=test_frontmatter.md SCHEMA=generated_schema.json"; \
		exit 1; \
	fi
	@echo "🔍 Validating $(FILE) with detailed errors..."
	@$(MARKITECT) validate $(FILE) $(SCHEMA) --detailed-errors --error-format text

# AST operations
cli-ast-show: $(VENV)/bin/activate
	@if [ -z "$(FILE)" ]; then \
		echo "🌳 Showing AST for sample document..."; \
		$(MARKITECT) ast-show $(SAMPLE_DOC); \
	else \
		echo "🌳 Showing AST for document: $(FILE)"; \
		$(MARKITECT) ast-show $(FILE); \
	fi

cli-ast-stats: $(VENV)/bin/activate
	@if [ -z "$(FILE)" ]; then \
		echo "📈 Showing AST statistics for sample document..."; \
		$(MARKITECT) ast-stats $(SAMPLE_DOC); \
	else \
		echo "📈 Showing AST statistics for document: $(FILE)"; \
		$(MARKITECT) ast-stats $(FILE); \
	fi

cli-ast-query: $(VENV)/bin/activate
	@if [ -z "$(FILE)" ] || [ -z "$(QUERY)" ]; then \
		echo "❌ Usage: make cli-ast-query FILE=document.md QUERY='JSONPath expression'"; \
		echo "   Example: make cli-ast-query FILE=test_frontmatter.md QUERY='$.headings[*].text'"; \
		exit 1; \
	fi
	@echo "🔍 Querying AST: $(QUERY)"
	@$(MARKITECT) ast-query $(FILE) '$(QUERY)'

# Metadata operations
cli-metadata: $(VENV)/bin/activate
	@if [ -z "$(FILE)" ]; then \
		echo "🏷️  Showing metadata for sample document..."; \
		$(MARKITECT) metadata $(SAMPLE_DOC) --format $(OUTPUT_FORMAT); \
	else \
		echo "🏷️  Showing metadata for document: $(FILE)"; \
		$(MARKITECT) metadata $(FILE) --format $(OUTPUT_FORMAT); \
	fi

# Database operations
cli-query: $(VENV)/bin/activate
	@if [ -z "$(SQL)" ]; then \
		echo "❌ Usage: make cli-query SQL='SELECT statement'"; \
		echo "   Example: make cli-query SQL='SELECT * FROM files LIMIT 5'"; \
		exit 1; \
	fi
	@echo "🗄️  Executing SQL query..."
	@$(MARKITECT) query '$(SQL)' --format $(OUTPUT_FORMAT)

cli-schema-db: $(VENV)/bin/activate
	@echo "🗄️  Showing database schema..."
	@$(MARKITECT) schema

# Cache management
cli-cache-info: $(VENV)/bin/activate
	@echo "💾 Cache information..."
	@$(MARKITECT) cache-info

cli-cache-clean: $(VENV)/bin/activate
	@echo "🧹 Cleaning cache..."
	@$(MARKITECT) cache-clean

cli-cache-invalidate: $(VENV)/bin/activate
	@if [ -z "$(FILE)" ]; then \
		echo "❌ Usage: make cli-cache-invalidate FILE=document.md"; \
		exit 1; \
	fi
	@echo "🔄 Invalidating cache for $(FILE)..."
	@$(MARKITECT) cache-invalidate $(FILE)

# Schema visualization
cli-visualize-schema: $(VENV)/bin/activate
	@if [ -z "$(SCHEMA)" ]; then \
		echo "❌ Usage: make cli-visualize-schema SCHEMA=schema.json"; \
		echo "   Example: make cli-visualize-schema SCHEMA=generated_schema.json"; \
		exit 1; \
	fi
	@echo "🎨 Visualizing schema: $(SCHEMA)"
	@$(VENV_PYTHON) visualize_schema.py $(SCHEMA)

cli-visualize-schema-ascii: $(VENV)/bin/activate
	@if [ -z "$(SCHEMA)" ]; then \
		echo "❌ Usage: make cli-visualize-schema-ascii SCHEMA=schema.json"; \
		echo "   Example: make cli-visualize-schema-ascii SCHEMA=generated_schema.json"; \
		exit 1; \
	fi
	@echo "🎨 Visualizing schema (ASCII mode): $(SCHEMA)"
	@$(VENV_PYTHON) visualize_schema.py $(SCHEMA) --ascii

# Complete workflow examples
cli-workflow-basic: $(VENV)/bin/activate
	@echo "🔄 Running basic MarkiTect workflow..."
	@echo "  Step 1: Ingest document"
	@$(MARKITECT) ingest $(SAMPLE_DOC)
	@echo ""
	@echo "  Step 2: Show status"
	@$(MARKITECT) status $(SAMPLE_DOC)
	@echo ""
	@echo "  Step 3: Show AST statistics"
	@$(MARKITECT) ast-stats $(SAMPLE_DOC)
	@echo ""
	@echo "✅ Basic workflow complete!"

cli-workflow-schema: $(VENV)/bin/activate
	@echo "🔄 Running schema generation and validation workflow..."
	@if [ -z "$(FILE)" ]; then \
		echo "❌ Usage: make cli-workflow-schema FILE=document.md"; \
		echo "   Example: make cli-workflow-schema FILE=test_frontmatter.md"; \
		exit 1; \
	fi
	@echo "  Step 1: Ingest document"
	@$(MARKITECT) ingest $(FILE)
	@echo ""
	@echo "  Step 2: Generate schema"
	@$(MARKITECT) schema-generate $(FILE) --format json > temp_schema.json
	@echo "  Schema saved to temp_schema.json"
	@echo ""
	@echo "  Step 3: Validate document against generated schema"
	@$(MARKITECT) validate $(FILE) temp_schema.json
	@echo ""
	@echo "  Step 4: Visualize schema"
	@$(VENV_PYTHON) visualize_schema.py temp_schema.json --ascii
	@echo ""
	@echo "✅ Schema workflow complete!"
	@echo "💡 Schema file: temp_schema.json"

# Help for CLI targets
cli-help:
	@echo "🚀 MarkiTect CLI Usage Targets"
	@echo "============================="
	@echo ""
	@echo "Document Operations:"
	@echo "  cli-ingest [FILE=doc.md]     - Process and store markdown file"
	@echo "  cli-status [FILE=doc.md]     - Show processing status"
	@echo "  cli-list [OUTPUT_FORMAT=table] - List all processed documents"
	@echo "  cli-get [FILE=doc.md]        - Retrieve processed document"
	@echo "  cli-metadata [FILE=doc.md]   - Show document metadata"
	@echo ""
	@echo "Schema Operations:"
	@echo "  cli-schema-generate [FILE=doc.md]        - Generate JSON schema"
	@echo "  cli-schema-ingest SCHEMA=schema.json     - Store schema in database"
	@echo "  cli-schema-list [OUTPUT_FORMAT=table]   - List stored schemas"
	@echo "  cli-schema-get SCHEMA=name               - Retrieve stored schema"
	@echo "  cli-validate FILE=doc.md SCHEMA=schema.json - Validate document"
	@echo "  cli-validate-detailed FILE=doc.md SCHEMA=schema.json - Detailed validation"
	@echo "  cli-visualize-schema SCHEMA=schema.json  - Visualize schema (colorful)"
	@echo "  cli-visualize-schema-ascii SCHEMA=schema.json - Visualize schema (ASCII)"
	@echo ""
	@echo "AST Operations:"
	@echo "  cli-ast-show [FILE=doc.md]   - Display AST structure"
	@echo "  cli-ast-stats [FILE=doc.md]  - Show AST statistics"
	@echo "  cli-ast-query FILE=doc.md QUERY='JSONPath' - Query AST"
	@echo ""
	@echo "Database Operations:"
	@echo "  cli-query SQL='SELECT...'    - Execute SQL query"
	@echo "  cli-schema-db               - Show database schema"
	@echo ""
	@echo "Cache Management:"
	@echo "  cli-cache-info              - Show cache statistics"
	@echo "  cli-cache-clean             - Clear all caches"
	@echo "  cli-cache-invalidate FILE=doc.md - Invalidate specific file cache"
	@echo ""
	@echo "Complete Workflows:"
	@echo "  cli-workflow-basic          - Basic ingest → status → stats workflow"
	@echo "  cli-workflow-schema FILE=doc.md - Complete schema workflow"
	@echo ""
	@echo "📋 Variables:"
	@echo "  FILE         - Target markdown file (default: $(SAMPLE_DOC))"
	@echo "  OUTPUT_FORMAT - Output format: table, json, yaml, simple (default: $(OUTPUT_FORMAT))"
	@echo "  SCHEMA       - JSON schema file"
	@echo "  SQL          - SQL query string"
	@echo "  QUERY        - JSONPath query expression"
	@echo ""
	@echo "💡 Examples:"
	@echo "  make cli-ingest FILE=my_document.md"
	@echo "  make cli-list OUTPUT_FORMAT=table"
	@echo "  make cli-schema-list OUTPUT_FORMAT=simple"
	@echo "  make cli-validate FILE=doc.md SCHEMA=doc_schema.json"
	@echo "  make cli-ast-query FILE=doc.md QUERY='$.headings[*].text'"
	@echo "  make cli-query SQL='SELECT title FROM metadata WHERE status=\"draft\"'"

# Update .PHONY for CLI targets
.PHONY: cli-ingest cli-status cli-list cli-get cli-schema-generate cli-schema-ingest cli-schema-list cli-schema-get cli-validate cli-validate-detailed cli-ast-show cli-ast-stats cli-ast-query cli-metadata cli-query cli-schema-db cli-cache-info cli-cache-clean cli-cache-invalidate cli-visualize-schema cli-visualize-schema-ascii cli-workflow-basic cli-workflow-schema cli-help

# ============================================================================
# Requirements Engineering Integration
# ============================================================================

# Validate project requirements and foundations before development
validate-requirements: $(VENV)/bin/activate
	@echo "🔍 Validating project requirements and foundations..."
	@PYTHONPATH=. $(VENV_PYTHON) tools/requirements_engineering_toolkit.py analyze

# Check interface compatibility for specific interface
check-interface-compatibility: $(VENV)/bin/activate
	@if [ -z "$(INTERFACE)" ]; then \
		echo "❌ Please specify interface: make check-interface-compatibility INTERFACE=IssueBackend"; \
		exit 1; \
	fi
	@echo "🔌 Checking interface compatibility for $(INTERFACE)..."
	@PYTHONPATH=. $(VENV_PYTHON) tools/requirements_engineering_toolkit.py plan-interface --interface $(INTERFACE)

# Generate development checklist for specific feature
generate-dev-checklist: $(VENV)/bin/activate
	@if [ -z "$(FEATURE)" ]; then \
		echo "❌ Please specify feature: make generate-dev-checklist FEATURE='Your Feature Name'"; \
		exit 1; \
	fi
	@echo "📋 Generating development checklist for $(FEATURE)..."
	@PYTHONPATH=. $(VENV_PYTHON) tools/requirements_engineering_toolkit.py checklist --feature "$(FEATURE)"

# Validate mock object compatibility
validate-mocks: $(VENV)/bin/activate
	@echo "🧪 Validating mock object compatibility..."
	@if [ -f "tests/test_mock_compatibility.py" ]; then \
		PYTHONPATH=. $(VENV_PYTHON) -m pytest tests/test_mock_compatibility.py -xvs; \
	else \
		echo "⚠️  Mock compatibility tests not found"; \
		echo "   Run 'make setup-mock-validation' to create them"; \
	fi

# Pre-commit validation including requirements
pre-commit-validate: validate-requirements validate-mocks
	@echo "✅ Pre-commit validation complete"

# Setup mock validation test file
setup-mock-validation: $(VENV)/bin/activate
	@echo "🔧 Setting up mock validation tests..."
	@if [ ! -f "tests/test_mock_compatibility.py" ]; then \
		cp docs/integration/requirements_engineering_integration.md tests/temp_integration_guide.md; \
		echo "💡 Mock compatibility test template available in integration guide"; \
		echo "   Create tests/test_mock_compatibility.py based on the guide"; \
		echo "   See docs/integration/requirements_engineering_integration.md"; \
	else \
		echo "✅ Mock validation tests already exist"; \
	fi

# View requirements engineering usage examples
view-requirements-examples: $(VENV)/bin/activate
	@echo "📖 Requirements Engineering Usage Examples"
	@echo "========================================="
	@echo ""
	@echo "Foundation Analysis:"
	@echo "  make validate-requirements"
	@echo ""
	@echo "Interface Planning:"
	@echo "  make check-interface-compatibility INTERFACE=IssueBackend"
	@echo "  make check-interface-compatibility INTERFACE=PluginManager"
	@echo ""
	@echo "Feature Development:"
	@echo "  make generate-dev-checklist FEATURE='New Plugin System'"
	@echo "  make generate-dev-checklist FEATURE='CLI Enhancement'"
	@echo ""
	@echo "Mock Validation:"
	@echo "  make validate-mocks"
	@echo "  make setup-mock-validation"
	@echo ""
	@echo "Complete Workflow:"
	@echo "  make pre-commit-validate"
	@echo ""
	@echo "📋 Prevention Demo:"
	@echo "  PYTHONPATH=. $(VENV_PYTHON) examples/issue_59_prevention_demo.py"

# Update .PHONY for requirements engineering targets
.PHONY: validate-requirements check-interface-compatibility generate-dev-checklist validate-mocks pre-commit-validate setup-mock-validation view-requirements-examples
