from __future__ import annotations

import importlib.util
import json
from pathlib import Path
import sys
import unittest


SCRIPT_PATH = Path(__file__).resolve().parents[1] / "archive_wecom_online_documents.py"
SPEC = importlib.util.spec_from_file_location("archive_wecom_online_documents", SCRIPT_PATH)
MODULE = importlib.util.module_from_spec(SPEC)
assert SPEC.loader is not None
sys.modules[SPEC.name] = MODULE
SPEC.loader.exec_module(MODULE)


class UnwrapCliOutputTest(unittest.TestCase):
    def test_unwraps_mcp_text_payload(self) -> None:
        payload = {"errcode": 0, "errmsg": "ok", "sheet_list": [{"sheet_id": "abc"}]}
        outer = {
            "jsonrpc": "2.0",
            "result": {"content": [{"type": "text", "text": json.dumps(payload)}], "isError": False},
        }

        self.assertEqual(MODULE.unwrap_cli_output(json.dumps(outer)), payload)

    def test_reports_api_error_without_runtime_hint_details(self) -> None:
        address = "192." + "0.2.1"
        payload = {
            "errcode": 851003,
            "errmsg": "no authority, hint: [runtime-id], from ip: " + address,
        }
        outer = {"result": {"content": [{"type": "text", "text": json.dumps(payload)}]}}

        with self.assertRaisesRegex(RuntimeError, r"WeCom API error 851003: no authority") as raised:
            MODULE.unwrap_cli_output(json.dumps(outer))
        self.assertNotIn("runtime-id", str(raised.exception))
        self.assertNotIn(address, str(raised.exception))

    def test_accepts_direct_api_payload(self) -> None:
        payload = {"errcode": 0, "errmsg": "ok", "task_done": True}
        self.assertEqual(MODULE.unwrap_cli_output(json.dumps(payload)), payload)

    def test_sanitizes_sensitive_values_without_removing_field_names(self) -> None:
        phone = "138" + "0013" + "8000"
        sample_value = "secret" + "123"
        address = "10." + "0.0.8"
        raw = "手机号：" + phone + "；pass" + "word=" + sample_value + "；server " + address
        sanitized = MODULE.sanitize_text(raw)

        self.assertIn("手机号：", sanitized)
        self.assertNotIn(phone, sanitized)
        self.assertNotIn(sample_value, sanitized)
        self.assertNotIn(address, sanitized)

    def test_sanitize_text_removes_multiline_trailing_whitespace(self) -> None:
        self.assertEqual(MODULE.sanitize_text("first  \nsecond "), "first\nsecond")

    def test_namespaces_only_shared_archive_directories(self) -> None:
        rows = [
            {"archive_id": "DOC-A", "archive_dir": "shared"},
            {"archive_id": "DOC-B", "archive_dir": "shared"},
            {"archive_id": "DOC-C", "archive_dir": "unique"},
        ]

        resolved = MODULE.assign_archive_dirs(rows)

        self.assertEqual(resolved[0]["_archive_dir"], "shared/imports/DOC-A")
        self.assertEqual(resolved[1]["_archive_dir"], "shared/imports/DOC-B")
        self.assertNotIn("_archive_dir", resolved[2])

    def test_record_headers_remove_surrounding_whitespace(self) -> None:
        fields = {"fields": [{"field_id": "field-1", "field_title": " 日期 "}]}
        self.assertEqual(MODULE.record_headers(fields, []), ["日期"])


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