"""工厂分派 `kimi-code-key` 单测：静态 Console Key 的 ToS 合规变体（不联网）。

`kimi-code-key` = Kimi Code 订阅 plan 的 **Console 静态 API Key** 路径——与 OAuth 的
`kimi-code` 命中同一 coding 端点 + 同一 model `kimi-for-coding` + 同样 thinking 开启
（故结构化输出走 JSON 模式）。**实测纠正**：coding 端点据 `User-Agent` 做 allow-list 门禁，
缺伪造头 → `403 access_terminated_error`，**无论 key 还是 OAuth**。故静态 key 路径也必须发
与 OAuth 相同的 `KimiCLI/1.37.0` + `X-Msh-*` 头（区别仅凭据来源是静态 key）。两条订阅路径
都需 UA 伪造 = 同样 ToS 风险；真正合规的只有 moonshot 平台 key（provider `kimi`）。

断言点：
- 命中 coding base URL；key 作为 bearer（OpenAI client 的 `api_key`）；
- default_headers **含** 伪造 UA（`KimiCLI`）+ `X-Msh-*` 头（过 coding 端点门禁）；
- 结构化客户端走 instructor JSON 模式（与 thinking 兼容）。
"""

from __future__ import annotations

import instructor
from ww_llm_gateway import build_adapter
from ww_llm_gateway.adapters.kimi_code import KIMI_CODE_BASE_URL
from ww_llm_gateway.adapters.kimi_code_key import KIMI_CODE_KEY_PROVIDER, KimiCodeKeyAdapter

_API_KEY = "kimi-console-static-key-not-real"


def test_factory_dispatches_kimi_code_key_to_kimi_code_key_adapter() -> None:
    adapter = build_adapter(KIMI_CODE_KEY_PROVIDER, api_key=_API_KEY)

    assert isinstance(adapter, KimiCodeKeyAdapter)
    assert adapter.provider == "kimi-code-key"


def test_factory_kimi_code_key_defaults_coding_base_url_and_bearer() -> None:
    adapter = build_adapter(KIMI_CODE_KEY_PROVIDER, api_key=_API_KEY)
    assert isinstance(adapter, KimiCodeKeyAdapter)
    client = adapter._client  # noqa: SLF001 — 断言注入客户端配置

    assert str(client.base_url).rstrip("/") == KIMI_CODE_BASE_URL.rstrip("/")
    assert client.api_key == _API_KEY


def test_factory_kimi_code_key_sends_spoofed_headers() -> None:
    """实测纠正：coding 端点据 UA 做 allow-list 门禁（缺伪造头→403），故静态 key 也必须发
    与 OAuth 相同的 `KimiCLI/1.37.0` + `X-Msh-*` 头。"""
    adapter = build_adapter(KIMI_CODE_KEY_PROVIDER, api_key=_API_KEY)
    assert isinstance(adapter, KimiCodeKeyAdapter)
    headers = adapter._client.default_headers  # noqa: SLF001

    # 伪造官方客户端 UA（过 coding 端点 access_terminated_error 门禁）。
    assert "KimiCLI" in str(headers.get("User-Agent", ""))
    # 带 OAuth 路径同款 X-Msh-* 头集。
    assert any(str(k).lower().startswith("x-msh-") for k in headers)


def test_factory_kimi_code_key_structured_client_uses_json_mode() -> None:
    """coding 端点 thinking 开启 → 结构化必须走 instructor JSON 模式（非 TOOLS）。"""
    adapter = build_adapter(KIMI_CODE_KEY_PROVIDER, api_key=_API_KEY)
    assert isinstance(adapter, KimiCodeKeyAdapter)

    structured = adapter._structured()  # noqa: SLF001
    assert getattr(structured, "mode", None) is instructor.Mode.JSON


def test_factory_kimi_code_key_honors_explicit_base_url() -> None:
    custom = "https://example.test/coding/v1"
    adapter = build_adapter(KIMI_CODE_KEY_PROVIDER, api_key=_API_KEY, base_url=custom)
    assert isinstance(adapter, KimiCodeKeyAdapter)

    assert str(adapter._client.base_url).rstrip("/") == custom.rstrip("/")  # noqa: SLF001
