"""Test setup for framework tests.

Two responsibilities:

1. **MCP submodule bindings** -- ensures ``framework.loader`` submodules
   are attached to the parent package so monkeypatch's dotted-string API
   (``monkeypatch.setattr("framework.loader.foo.Y", ...)``) resolves even
   when no test has imported the submodule yet.

2. **Global hive-home isolation** -- redirects ``~/.hive`` to a per-test
   tmp directory for every test in the suite. Without this, any test
   that instantiates a real ``SessionManager`` or calls ``_start_queen``
   leaks real session directories into the developer's actual
   ``~/.hive/agents/queens/`` tree, polluting the queen DM history and
   occasionally hijacking the live server's navigation.
"""

from __future__ import annotations

import importlib
from pathlib import Path

import pytest

import framework.loader  # noqa: F401 — load parent package first
import framework.loader.mcp_client as _mcp_client
import framework.loader.mcp_connection_manager as _mcp_connection_manager
import framework.loader.mcp_registry as _mcp_registry

framework.loader.mcp_registry = _mcp_registry
framework.loader.mcp_connection_manager = _mcp_connection_manager
framework.loader.mcp_client = _mcp_client


# ---------------------------------------------------------------------------
# Global hive-home isolation
# ---------------------------------------------------------------------------


_HIVE_PATH_CONSUMERS = (
    "framework.config",
    "framework.server.session_manager",
    "framework.server.queen_orchestrator",
    "framework.server.routes_queens",
    "framework.server.routes_skills",
    "framework.server.app",
    "framework.agents.discovery",
    "framework.agents.queen.queen_profiles",
    "framework.tools.queen_lifecycle_tools",
    "framework.storage.migrate_v2",
    "framework.loader.cli",
)

_HIVE_PATH_NAMES = (
    ("HIVE_HOME", lambda h: h),
    ("QUEENS_DIR", lambda h: h / "agents" / "queens"),
    ("COLONIES_DIR", lambda h: h / "colonies"),
    ("MEMORIES_DIR", lambda h: h / "memories"),
    ("HIVE_CONFIG_FILE", lambda h: h / "configuration.json"),
)


@pytest.fixture(autouse=True)
def _no_seed_mcp_defaults(monkeypatch):
    """Skip bundled-server seeding in MCPRegistry.initialize() for tests.

    Production wants ``initialize()`` to seed ``hive_tools`` / ``gcu-tools``
    / ``files-tools`` / ``terminal-tools`` / ``chart-tools`` so a fresh
    HIVE_HOME comes up with working defaults. Tests want a deterministic
    empty registry — every assertion about counts, "no servers installed"
    output, or first-element identity breaks otherwise. Patching here
    keeps the production API clean and avoids a test-only flag on
    ``initialize()``.
    """
    monkeypatch.setattr(_mcp_registry.MCPRegistry, "_seed_defaults", lambda self: [])


@pytest.fixture(autouse=True)
def _isolate_hive_home_autouse(tmp_path, monkeypatch):
    """Per-test isolation of ``~/.hive`` to ``tmp_path/.hive``.

    Every test automatically gets Path.home() redirected to its own
    tmp directory and every module-level ``HIVE_HOME``/``QUEENS_DIR``/
    ``COLONIES_DIR`` binding rewritten. Tests that need to read from
    the developer's real home can explicitly unpatch these by calling
    ``monkeypatch.undo()`` at the start -- none currently do.
    """
    fake_home_root = tmp_path
    fake_hive = fake_home_root / ".hive"
    fake_hive.mkdir(exist_ok=True)
    monkeypatch.setattr(Path, "home", classmethod(lambda cls: fake_home_root))
    for mod_name in _HIVE_PATH_CONSUMERS:
        try:
            mod = importlib.import_module(mod_name)
        except ImportError:
            continue
        for attr_name, builder in _HIVE_PATH_NAMES:
            if hasattr(mod, attr_name):
                monkeypatch.setattr(mod, attr_name, builder(fake_hive))
    yield fake_hive
