from types import SimpleNamespace

from openjiuwen_deepsearch.framework.openjiuwen.tools.search_api.native_local_search_api.api_wrapper import (
    NativeLocalSearchAPIWrapper,
)


def _build_wrapper() -> NativeLocalSearchAPIWrapper:
    return NativeLocalSearchAPIWrapper(knowledge_base_configs=[])


def test_process_and_format_prefers_metadata_document_name():
    wrapper = _build_wrapper()
    retrieval_result = SimpleNamespace(
        doc_id="doc-1",
        chunk_id="chunk-9",
        text="content body",
        score=0.98,
        metadata={"document_name": "Annual Report 2025.pdf"},
    )

    result = wrapper._process_and_format([{"raw": retrieval_result, "kb_id": "kb-a"}], num=1)

    assert len(result) == 1
    assert result[0]["title"] == "Annual Report 2025.pdf"
    assert result[0]["document_name"] == "Annual Report 2025.pdf"
    assert result[0]["file_id"] == "doc-1"


def test_process_and_format_prefers_direct_field_title():
    wrapper = _build_wrapper()
    retrieval_result = SimpleNamespace(
        doc_id="doc-2",
        chunk_id="chunk-1",
        text="another body",
        score=0.9,
        metadata={"document_name": "Ignored Metadata Name", "title": "Project Plan"},
    )

    result = wrapper._process_and_format([{"raw": retrieval_result, "kb_id": "kb-b"}], num=1)

    assert len(result) == 1
    assert result[0]["title"] == "Project Plan"
    assert result[0]["document_name"] == "Ignored Metadata Name"


def test_process_and_format_falls_back_to_unique_id():
    wrapper = _build_wrapper()
    retrieval_result = SimpleNamespace(
        doc_id="",
        chunk_id="chunk-2",
        text="fallback body",
        score=0.8,
        metadata={},
    )

    result = wrapper._process_and_format([{"raw": retrieval_result, "kb_id": "kb-c"}], num=1)

    assert len(result) == 1
    assert result[0]["title"] == "missing_id_chunk-2"
    assert result[0]["document_name"] == "missing_id_chunk-2"
    assert result[0]["file_id"] == "missing_id_chunk-2"