import pytest

from openjiuwen_deepsearch.algorithm.user_feedback_processor.section_locator import (
    locate_enclosing_numbered_major_block,
    locate_section,
)


@pytest.mark.parametrize(
    ("report", "needle", "expected_heading_prefix"),
    [
        (
            "# 标题\n\n## 第一章\nA\n\n## 第二章\n这里是选中内容\n更多内容\n",
            "选中内容",
            "## 第二章",
        ),
        (
            "# 标题\n\n"
            "## 第二章\n"
            "章节前言\n\n"
            "### 2.1 小节\n"
            "这里是选中内容\n"
            "更多内容\n\n"
            "### 2.2 小节\n"
            "别的内容\n",
            "选中内容",
            "### 2.1 小节",
        ),
    ],
    ids=["h2_encloses_selection", "prefers_deepest_enclosing_heading"],
)
def test_locate_section_selects_smallest_enclosing_block(report, needle, expected_heading_prefix):
    start = report.index(needle)
    end = start + len(needle)

    section = locate_section(report, start, end)

    assert section.section_text.startswith(expected_heading_prefix)
    assert section.section_start_offset == report.index(expected_heading_prefix)


def test_locate_section_falls_back_to_full_report_when_no_heading():
    report = "纯文本报告"

    section = locate_section(report, 0, 2)

    assert section.section_text == report


def test_locate_enclosing_numbered_major_block_returns_containing_h1_block():
    report = (
        "# 1. 第一大章\n"
        "前言\n"
        "## 1.1 已有小节\n"
        "已有内容\n"
        "## 1.2 目标小节\n"
        "目标内容\n"
        "# 2. 第二大章\n"
        "其他内容"
    )
    start = report.index("目标内容")
    end = start + len("目标内容")

    block = locate_enclosing_numbered_major_block(report, start, end)

    assert block is not None
    assert block.title == "1. 第一大章"
    assert block.heading == "# 1. 第一大章"
    assert block.level == 1
    assert block.block_start == 0
    assert block.block_end == report.index("# 2. 第二大章")


def test_locate_enclosing_numbered_major_block_ignores_unnumbered_h1():
    report = "# 第一大章\n## 1.1 目标小节\n目标内容\n# 2. 第二大章\n其他内容"
    start = report.index("目标内容")
    end = start + len("目标内容")

    block = locate_enclosing_numbered_major_block(report, start, end)

    assert block is None