from pathlib import Path


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

FILES = {
    "AgrarianWaterSource.h": ROOT / "Source" / "AgrarianGame" / "AgrarianWaterSource.h",
    "AgrarianWaterSource.cpp": ROOT / "Source" / "AgrarianGame" / "AgrarianWaterSource.cpp",
    "AgrarianGameCharacter.cpp": ROOT / "Source" / "AgrarianGame" / "AgrarianGameCharacter.cpp",
    "GroundZeroWaterSource.md": ROOT / "Docs" / "Terrain" / "GroundZeroWaterSource.md",
    "verify_ground_zero_water_source.py": ROOT / "Scripts" / "verify_ground_zero_water_source.py",
}

REQUIRED_SNIPPETS = {
    "AgrarianWaterSource.h": [
        "class AGRARIANGAME_API AAgrarianWaterSource : public AActor, public IAgrarianInteractable",
        "float WaterRestoreAmount = 45.0f;",
        "virtual FText GetInteractionText_Implementation",
        "virtual bool CanInteract_Implementation",
        "virtual void Interact_Implementation",
    ],
    "AgrarianWaterSource.cpp": [
        "bReplicates = true;",
        "Drink from {0}",
        "Interactor != nullptr && Interactor->GetSurvivalComponent() != nullptr",
        "if (!HasAuthority() || !Interactor)",
        "SurvivalComponent->AddWater(WaterRestoreAmount);",
    ],
    "AgrarianGameCharacter.cpp": [
        "FindFocusedInteractable",
        "IAgrarianInteractable::Execute_CanInteract",
        "IAgrarianInteractable::Execute_GetInteractionText",
        "ServerInteract(HitActor);",
        "FVector::DistSquared(TargetActor->GetActorLocation(), GetActorLocation())",
        "IAgrarianInteractable::Execute_Interact(TargetActor, this);",
    ],
    "GroundZeroWaterSource.md": [
        "The water source is an interactable actor.",
        "it restores thirst through `UAgrarianSurvivalComponent::AddWater`",
        "Interaction text: `Drink from Fresh Water Spring`",
    ],
    "verify_ground_zero_water_source.py": [
        "WATER_SOURCE_LABEL = \"AGR_GZ_FreshWaterSource_01\"",
        "EXPECTED_WATER_RESTORE = 45.0",
        "is not an AgrarianWaterSource",
    ],
}


def main():
    missing = []
    for label, path in FILES.items():
        text = path.read_text(encoding="utf-8")
        for snippet in REQUIRED_SNIPPETS[label]:
            if snippet not in text:
                missing.append(f"{label}: missing {snippet!r}")

    if missing:
        raise SystemExit("Water gathering interaction verification failed:\n" + "\n".join(missing))

    print(
        "PASS: water gathering interaction uses the shared focused interact path, "
        "server-authoritative water restoration, Ground Zero placement verification, "
        "and player-facing documentation."
    )


if __name__ == "__main__":
    main()
