#!/usr/bin/env python3
"""Validate native wildlife navigation support wiring."""

from pathlib import Path
import sys

REPO_ROOT = Path(__file__).resolve().parents[1]


def read_text(relative_path: str) -> str:
    path = REPO_ROOT / relative_path
    if not path.exists():
        raise AssertionError(f"Missing required file: {relative_path}")
    return path.read_text(encoding="utf-8")


def require(needle: str, haystack: str, context: str) -> None:
    if needle not in haystack:
        raise AssertionError(f"Missing {needle!r} in {context}")


def main() -> int:
    errors: list[str] = []

    try:
        build_cs = read_text("Source/AgrarianGame/AgrarianGame.Build.cs")
        require('"AIModule"', build_cs, "AgrarianGame.Build.cs")
        require('"NavigationSystem"', build_cs, "AgrarianGame.Build.cs")
    except AssertionError as exc:
        errors.append(str(exc))

    try:
        header = read_text("Source/AgrarianGame/AgrarianWildlifeBase.h")
        for marker in [
            "bUseNavigationMovement",
            "NavigationAcceptanceRadius",
            "NavigationRepathDistance",
            "NavigationProjectionExtent",
            "ChooseReachableWanderTarget",
            "ProjectPointToNavigation",
            "RequestNavigationMove",
            "DirectMoveTowardLocation",
        ]:
            require(marker, header, "AgrarianWildlifeBase.h")
    except AssertionError as exc:
        errors.append(str(exc))

    try:
        source = read_text("Source/AgrarianGame/AgrarianWildlifeBase.cpp")
        for marker in [
            '#include "AIController.h"',
            '#include "NavigationSystem.h"',
            "AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned",
            "AIControllerClass = AAIController::StaticClass()",
            "SpawnDefaultController()",
            "GetRandomReachablePointInRadius",
            "ProjectPointToNavigation",
            "MoveToLocation",
            "EPathFollowingRequestResult::Failed",
            "StopMovement()",
            "DirectMoveTowardLocation",
        ]:
            require(marker, source, "AgrarianWildlifeBase.cpp")
    except AssertionError as exc:
        errors.append(str(exc))

    try:
        roadmap = read_text("AGRARIAN_DEVELOPMENT_ROADMAP.md")
        require("[x] Add navigation support for wildlife.", roadmap, "AGRARIAN_DEVELOPMENT_ROADMAP.md")
        docs = read_text("Docs/TechnicalDesignDocument.md")
        require("Wildlife Navigation", docs, "Docs/TechnicalDesignDocument.md")
        require("falls back to direct movement input", docs, "Docs/TechnicalDesignDocument.md")
    except AssertionError as exc:
        errors.append(str(exc))

    if errors:
        for error in errors:
            print(f"ERROR: {error}", file=sys.stderr)
        return 1

    print("Wildlife navigation support is wired.")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
