GODOT := $(shell command -v godot4 2>/dev/null || command -v godot 2>/dev/null)

.PHONY: help setup build client server test lint ci ci-client ci-server clean \
       decisions-sync decisions-coverage decisions-active decisions-orphan \
       db-backup db-install

# --- Configuration ---

GODOT_VERSION ?= 4.6

# Default
help:
	@echo "The Settled Reach — Development Commands"
	@echo ""
	@echo "  make setup          Install dev dependencies (Rust, Godot, tooling)"
	@echo "  make build          Build client and server"
	@echo "  make client         Run the Godot client"
	@echo "  make server         Run the Rust simulation server"
	@echo "  make test           Run all tests"
	@echo "  make lint           Run all linters"
	@echo "  make ci             Run full CI pipeline locally"
	@echo "  make ci-client      Run client CI checks"
	@echo "  make ci-server      Run server CI checks"
	@echo "  make clean          Remove build artifacts and caches"
	@echo ""
	@echo "  make db-backup          Backup shared database to git (main only)"
	@echo "  make db-install         Restore shared database from backup"
	@echo ""
	@echo "  make decisions-sync     Sync decisions/*.md into SQLite"
	@echo "  make decisions-coverage Decision-to-ticket coverage by domain"
	@echo "  make decisions-active   List active decisions"
	@echo "  make decisions-orphan   Decisions without implementing tickets"
	@echo ""
	@echo "  GODOT_VERSION=4.6 make setup   Override Godot version"

# --- Setup ---

setup: setup-rust setup-godot setup-tooling decisions-sync
	@echo "Dev environment ready."

setup-rust:
	@tooling/install-rust

setup-godot:
	@GODOT_VERSION=$(GODOT_VERSION) tooling/install-godot

setup-tooling:
	@echo "Checking tooling dependencies..."
	@command -v python3 >/dev/null 2>&1 || { echo "Install Python 3"; exit 1; }
	@command -v curl >/dev/null 2>&1 || { echo "Install curl (required for Godot download)"; exit 1; }
	@command -v unzip >/dev/null 2>&1 || { echo "Install unzip (required for Godot download)"; exit 1; }

# --- Build ---

build: build-server build-client

build-server:
	cd server && cargo build

build-client:
	@test -n "$(GODOT)" || { echo "Godot not found. Run 'make setup' first."; exit 1; }
	$(GODOT) --headless --path client --quit

# --- Run ---

server:
	cd server && cargo run

client:
	@test -n "$(GODOT)" || { echo "Godot not found. Run 'make setup' first."; exit 1; }
	$(GODOT) --path client

# --- Test ---

test: test-server test-client

test-server:
	cd server && cargo nextest run

fixtures:
	cd server && cargo test --test gen_fixtures -- --ignored

test-client:
	@test -n "$(GODOT)" || { echo "Godot not found. Run 'make setup' first."; exit 1; }
	$(GODOT) --headless --path client -s res://addons/gdUnit4/bin/GdUnitCmdTool.gd --ignoreHeadlessMode -a res://tests/

# --- Lint ---

lint: lint-server lint-client

lint-server:
	cd server && cargo clippy -- -D warnings
	cd server && cargo fmt --check

lint-client:
	@test -n "$(GODOT)" || { echo "Godot not found. Run 'make setup' first."; exit 1; }
	@echo "Checking GDScript for errors..."
	@$(GODOT) --headless --path client --quit 2>&1 | grep -i "SCRIPT ERROR" && { echo "GDScript errors found"; exit 1; } || echo "No script errors found"

# --- CI (run locally) ---

ci: ci-server ci-client

ci-server: lint-server build-server test-server

ci-client: lint-client build-client test-client

# --- Database ---

db-backup:
	@tooling/db-backup

db-install:
	@tooling/db-install

# --- Decisions ---

decisions-sync:
	@db/connectors/decisions-sync

decisions-coverage:
	@db/connectors/sqlite-query "SELECT d.domain, COUNT(DISTINCT d.id) as decisions, COUNT(DISTINCT t.decision_ref) as with_tickets FROM decisions d LEFT JOIN tickets t ON d.id = t.decision_ref WHERE d.status='active' AND d.type='confirmed' GROUP BY d.domain"

decisions-active:
	@db/connectors/sqlite-query "SELECT id, domain, title FROM decisions WHERE status='active' AND type='confirmed' ORDER BY domain, id"

decisions-orphan:
	@db/connectors/sqlite-query "SELECT id, title FROM decisions WHERE type='confirmed' AND status='active' AND id NOT IN (SELECT DISTINCT decision_ref FROM tickets WHERE decision_ref IS NOT NULL)"

# --- Clean ---

clean:
	cd server && cargo clean || true
	rm -rf .cache/*
	rm -rf client/.godot client/reports
	@echo "Clean complete."
