"""Optional native Verifiers tests; core installs do not acquire the gym SDK."""

import asyncio
from pathlib import Path
import sys

import pytest

pytest.importorskip("verifiers.v1", reason="optional requirements/verifiers.txt environment")
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "examples/agent_gyms"))

import verifiers.v1 as vf  # noqa: E402
from verifiers.v1.graph import MessageNode  # noqa: E402
from verifiers.v1.trace import AgentInfo, TraceTask  # noqa: E402
from verifiers.v1.types import AssistantMessage  # noqa: E402
from verifiers.v1.utils.loaders import default_harness_id, load_harness  # noqa: E402
from verifiers.v1.harnesses.null import NullHarness  # noqa: E402

from verifiers_environment import (  # noqa: E402
    ENVIRONMENT_ID, GermanTaskset, GermanTasksetConfig, GermanState, restore_environment,
)
from verifiers_smoke import smoke  # noqa: E402


def test_loadable_environment_defaults_to_real_model_harness():
    harness = load_harness(vf.HarnessConfig(id=default_harness_id(ENVIRONMENT_ID)))
    assert isinstance(harness, NullHarness)
    assert type(harness).__name__ != "ScriptedFixtureHarness"


def test_task_metadata_stays_out_of_policy_prompt():
    tasks = list(GermanTaskset(GermanTasksetConfig(count=2, seed=7331)))
    assert len({task.data.metadata["record_id"] for task in tasks}) == 2
    for task in tasks:
        assert "private_facts" not in task.data.prompt
        assert "episode_seed" not in task.data.prompt
        assert task.data.metadata["record_id"] in task.data.prompt


def test_controller_rejects_unknown_trusted_command():
    task = next(iter(GermanTaskset(GermanTasksetConfig(count=1))))
    with pytest.raises(ValueError, match="invalid trusted MCP command"):
        restore_environment(task.data.metadata, [{"tool": "forged_lookup", "arguments": {}}])


def test_correct_answer_without_real_tools_is_not_success():
    task = next(iter(GermanTaskset(GermanTasksetConfig(count=1))))
    facts = task.data.metadata["private_facts"]
    trace = vf.Trace(task=TraceTask(data=task.data, type="GermanTask", key=task.key, hash=task.hash),
                     agent=AgentInfo(config=vf.AgentConfig(model="scripted-fixture/no-model")),
                     state=GermanState())
    trace.nodes.append(MessageNode(message=AssistantMessage(
        content=f"<answer>{facts['quantity'] * facts['unit_price']}</answer>")))
    asyncio.run(task.score(trace))
    assert trace.reward == 0
    assert trace.info["trusted_mcp_commands"] == []
    assert trace.info["strict_score"]["success"] is False


def test_native_rollout_mcp_reward_and_state_isolation(tmp_path):
    report = asyncio.run(smoke(tmp_path / "native"))
    assert report["status"] == "passed"
    assert report["model_inference"] is report["training"] is report["training_compatible"] is False
    assert [case["reward"] for case in report["cases"]] == [1, 1, 0, 0, 0, 0, 0]
    assert len({case["native_trace_id"] for case in report["cases"]}) == 7
