# -*- coding: utf-8 -*-
"""
懒访问上下文（Lazy Access Context）

借鉴 Hermes Agent 的 _ra() 懒导入模式，将模块级全局变量的访问封装为函数，
解决：
1. 测试 mock：无需导入整个 main.py，通过 set_context() 注入
2. 循环导入：延迟解析引用，避免模块初始化顺序依赖

使用方式：
    from abyss._globals import ctx

    tool = ctx().registry.get("file_read")   # 懒访问 registry
    host = ctx().host                        # 懒访问 lifecycle host

    # 测试中：
    ctx.override(registry=mock_reg, host=mock_host)
"""

from __future__ import annotations

from typing import Any


class _Context:
    """持有 agent 运行时的共享状态。"""

    def __init__(self):
        self.registry: Any = None
        self.host: Any = None
        self.esc: Any = None
        self.engine: Any = None
        self.curator_daemon: Any = None

    def is_ready(self) -> bool:
        """registry 是否已初始化。"""
        return self.registry is not None


class _LazyAccessor:
    """懒访问器：返回当前线程的 Context，测试可用 override 替换。"""

    def __init__(self):
        self._default = _Context()
        self._override: _Context | None = None

    def __call__(self) -> _Context:
        return self._override or self._default

    def override(self, **kwargs) -> _Context:
        """用给定属性创建覆盖 context。用于测试注入。"""
        ctx = _Context()
        for k, v in kwargs.items():
            if hasattr(ctx, k):
                setattr(ctx, k, v)
        self._override = ctx
        return ctx

    def restore(self) -> None:
        """清除覆盖，恢复默认 context。"""
        self._override = None


# 全局单例
ctx = _LazyAccessor()
