.PHONY: check check-net8 check-net10 run run-net8 run-net10 test clean help

DOTNET ?= dotnet

check: check-net8 check-net10

check-net8:
	@if $(DOTNET) --list-runtimes 2>/dev/null | grep -q '^Microsoft\.NETCore\.App 8\.'; then \
		$(DOTNET) run --framework net8.0 -- --check; \
	else \
		echo "SKIP net8.0 check: Microsoft.NETCore.App 8.x is unavailable"; \
	fi

check-net10:
	@if $(DOTNET) --list-runtimes 2>/dev/null | grep -q '^Microsoft\.NETCore\.App 10\.'; then \
		$(DOTNET) run --framework net10.0 -- --check; \
	else \
		echo "SKIP net10.0 check: Microsoft.NETCore.App 10.x is unavailable"; \
	fi

run:
	@if $(DOTNET) --list-runtimes 2>/dev/null | grep -q '^Microsoft\.NETCore\.App 10\.'; then \
		echo "Using net10.0"; \
		$(MAKE) run-net10; \
	elif $(DOTNET) --list-runtimes 2>/dev/null | grep -q '^Microsoft\.NETCore\.App 8\.'; then \
		echo "Using net8.0"; \
		$(MAKE) run-net8; \
	else \
		echo "ERROR: neither Microsoft.NETCore.App 10.x nor 8.x is available" >&2; \
		exit 1; \
	fi

run-net8:
	@if $(DOTNET) --list-runtimes 2>/dev/null | grep -q '^Microsoft\.NETCore\.App 8\.'; then \
		$(DOTNET) run --framework net8.0; \
	else \
		echo "SKIP net8.0 run: Microsoft.NETCore.App 8.x is unavailable"; \
	fi

run-net10:
	@if $(DOTNET) --list-runtimes 2>/dev/null | grep -q '^Microsoft\.NETCore\.App 10\.'; then \
		$(DOTNET) run --framework net10.0; \
	else \
		echo "SKIP net10.0 run: Microsoft.NETCore.App 10.x is unavailable"; \
	fi

test:
	@built=0; \
	if $(DOTNET) --list-runtimes 2>/dev/null | grep -q '^Microsoft\.NETCore\.App 8\.'; then \
		$(DOTNET) build --framework net8.0; built=1; \
	else \
		echo "SKIP net8.0 build: Microsoft.NETCore.App 8.x is unavailable"; \
	fi; \
	if $(DOTNET) --list-runtimes 2>/dev/null | grep -q '^Microsoft\.NETCore\.App 10\.'; then \
		$(DOTNET) build --framework net10.0; built=1; \
	else \
		echo "SKIP net10.0 build: Microsoft.NETCore.App 10.x is unavailable"; \
	fi; \
	if [ "$$built" -eq 0 ]; then echo "ERROR: no supported .NET runtime is available" >&2; exit 1; fi

clean:
	@if command -v "$(DOTNET)" >/dev/null 2>&1; then $(DOTNET) clean >/dev/null 2>&1 || true; fi
	rm -rf bin obj

help:
	@printf '%s\n' \
		'make check        Validate with every available supported framework' \
		'make check-net8   Validate with .NET 8 when available' \
		'make check-net10  Validate with .NET 10 when available' \
		'make run          Generate with .NET 10, falling back to .NET 8' \
		'make run-net8     Generate with .NET 8 when available' \
		'make run-net10    Generate with .NET 10 when available' \
		'make test         Build every available supported framework' \
		'make clean        Remove .NET build artifacts' \
		'make help         Show these targets'
