"""Deterministic agent runtime checks."""

from __future__ import annotations

import sys
import unittest
from pathlib import Path

PROJECT_ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(PROJECT_ROOT))
loaded_platform = sys.modules.get("platform")
if loaded_platform is not None and not hasattr(loaded_platform, "__path__"):
    del sys.modules["platform"]

import apps.abn_lookup_app as abn_app
from bridge_platform.agents.runtime import (
    AgentResolutionError,
    resolve_basic_instruction,
    resolve_instruction,
)
from bridge_platform.agents.tool_catalog import manifest_tools


class AgentRuntimeChecks(unittest.TestCase):
    def setUp(self):
        self.tools = manifest_tools(abn_app.APP_MANIFEST, compact=False)

    def test_resolves_abn_instruction_to_existing_action(self):
        selection = resolve_basic_instruction(
            "Check whether ABN 51 824 753 556 is registered.", self.tools,
        )
        self.assertEqual("deterministic_v1", selection["resolver"])
        self.assertEqual("business.au.abn.lookup", selection["capability"])
        self.assertEqual("lookup_v1", selection["action"])
        self.assertEqual("51824753556", selection["arguments"]["abn"])
        self.assertEqual("never", selection["confirmation"])

    def test_rejects_instruction_without_supported_tool_input(self):
        with self.assertRaises(AgentResolutionError) as raised:
            resolve_basic_instruction("Find a company called Example Pty Ltd.", self.tools)
        self.assertEqual("no_matching_tool", raised.exception.code)

    def test_cannot_select_tool_not_available_to_tenant(self):
        with self.assertRaises(AgentResolutionError) as raised:
            resolve_basic_instruction("Check ABN 51824753556.", [])
        self.assertEqual("no_matching_tool", raised.exception.code)

    def test_optional_provider_is_used_only_after_deterministic_no_match(self):
        class Selector:
            name = "test_provider"

            def __init__(self):
                self.calls = 0

            def select(self, message, tools, context):
                self.calls += 1
                return {
                    "tool": tools[0],
                    "arguments": {"abn": "51824753556", "include_history": False},
                    "provider": self.name,
                    "model": "fake-model",
                }

        selector = Selector()
        deterministic = resolve_instruction(
            "Check ABN 51824753556.", self.tools, provider=selector,
        )
        self.assertEqual("deterministic_v1", deterministic["resolver"])
        self.assertEqual(0, selector.calls)

        selected = resolve_instruction(
            "Please check the supplied business identifier.", self.tools,
            context={"tenant_id": "tenant-a"}, provider=selector,
        )
        self.assertEqual("test_provider", selected["resolver"])
        self.assertEqual("fake-model", selected["model"])
        self.assertEqual(1, selector.calls)


if __name__ == "__main__":
    unittest.main(verbosity=2)
