#!/usr/bin/env bash
set -euo pipefail

repo_root="$(git rev-parse --show-toplevel)"
cd "$repo_root"

mapfile -t staged_files < <(git diff --cached --name-only --diff-filter=ACMR)
if [[ ${#staged_files[@]} -eq 0 ]]; then
	exit 0
fi

has_staged_match() {
	local pattern="$1"
	for f in "${staged_files[@]}"; do
		if [[ "$f" =~ $pattern ]]; then
			return 0
		fi
	done
	return 1
}

server_route_like_changed=false
if has_staged_match '^server/NeonSprawl\.Server/.*(Api\.cs|Dtos\.cs|Program\.cs)$'; then
	server_route_like_changed=true
fi

if [[ "$server_route_like_changed" == true ]]; then
	if ! has_staged_match '^server/NeonSprawl\.Server\.Tests/'; then
		echo "pre-commit: server route/contract files changed but no server tests staged." >&2
		echo "Add or update tests under server/NeonSprawl.Server.Tests/ before commit." >&2
		exit 1
	fi
	if ! has_staged_match '^bruno/neon-sprawl-server/.*\.bru$'; then
		echo "pre-commit: server route/contract files changed but no Bruno request staged." >&2
		echo "Add/update .bru requests under bruno/neon-sprawl-server/ before commit." >&2
		exit 1
	fi
fi

if has_staged_match '^client/scripts/.*\.gd$'; then
	if ! has_staged_match '^client/test/.*_test\.gd$'; then
		echo "pre-commit: client/scripts .gd changes require test updates in client/test/*_test.gd." >&2
		exit 1
	fi
fi

# Enforce explicit AAA markers in changed C# test files.
for f in "${staged_files[@]}"; do
	if [[ ! "$f" =~ ^server/NeonSprawl\.Server\.Tests/.*Tests\.cs$ ]]; then
		continue
	fi
	if [[ ! -f "$f" ]]; then
		continue
	fi
	if ! rg -q 'Arrange' "$f" || ! rg -q 'Act' "$f" || ! rg -q 'Assert' "$f"; then
		echo "pre-commit: $f is missing explicit AAA markers (Arrange/Act/Assert)." >&2
		echo "Add clear Arrange/Act/Assert sections in changed C# tests." >&2
		exit 1
	fi
done
