# -*- coding: utf-8 -*-
"""INDEX 和 Utility 任务文档覆盖完整性验证。

**Validates: Requirements 5.1, 6.1**

Property 4: 对于所有在 task_registry.py 中注册且 layer="INDEX" 的任务代码，
index_tasks.md 中应包含该任务代码的说明章节。

Property 5: 对于所有在 task_registry.py 中注册且 task_type="utility" 的任务代码，
utility_tasks.md 中应包含该任务代码的说明章节。
"""
# Feature: etl-task-documentation, Property 4 & 5

from __future__ import annotations

from pathlib import Path

import pytest

from orchestration.task_registry import default_registry

# ── 测试数据准备 ──────────────────────────────────────────────

_PROJECT_ROOT = Path(__file__).resolve().parents[2]
_INDEX_DOC_PATH = _PROJECT_ROOT / "docs" / "etl_tasks" / "index_tasks.md"
_UTILITY_DOC_PATH = _PROJECT_ROOT / "docs" / "etl_tasks" / "utility_tasks.md"

# INDEX 层任务：通过 get_tasks_by_layer 获取
_INDEX_TASK_CODES: list[str] = default_registry.get_tasks_by_layer("INDEX")

# Utility 任务：注册表无 get_tasks_by_type，直接遍历内部字典筛选
_UTILITY_TASK_CODES: list[str] = [
    code
    for code, meta in default_registry._tasks.items()
    if meta.task_type == "utility"
]


# ── Fixtures ──────────────────────────────────────────────────

@pytest.fixture(scope="module")
def index_doc_content() -> str:
    """读取 index_tasks.md 全文。"""
    assert _INDEX_DOC_PATH.exists(), f"文档文件不存在: {_INDEX_DOC_PATH}"
    return _INDEX_DOC_PATH.read_text(encoding="utf-8")


@pytest.fixture(scope="module")
def utility_doc_content() -> str:
    """读取 utility_tasks.md 全文。"""
    assert _UTILITY_DOC_PATH.exists(), f"文档文件不存在: {_UTILITY_DOC_PATH}"
    return _UTILITY_DOC_PATH.read_text(encoding="utf-8")


# ── Property 4: INDEX 任务文档覆盖完整性 ──────────────────────

@pytest.mark.parametrize("task_code", _INDEX_TASK_CODES, ids=_INDEX_TASK_CODES)
def test_index_task_code_in_doc(task_code: str, index_doc_content: str):
    """Property 4: 每个注册的 INDEX 任务代码在 index_tasks.md 中有对应说明。

    **Validates: Requirements 5.1**
    """
    assert task_code in index_doc_content, (
        f"INDEX 任务 '{task_code}' 已在 task_registry 中注册，"
        f"但未在 index_tasks.md 中找到对应说明章节"
    )


# ── Property 5: Utility 任务文档覆盖完整性 ────────────────────

@pytest.mark.parametrize("task_code", _UTILITY_TASK_CODES, ids=_UTILITY_TASK_CODES)
def test_utility_task_code_in_doc(task_code: str, utility_doc_content: str):
    """Property 5: 每个注册的 task_type="utility" 任务代码在 utility_tasks.md 中有对应说明。

    **Validates: Requirements 6.1**
    """
    assert task_code in utility_doc_content, (
        f"Utility 任务 '{task_code}' 已在 task_registry 中注册，"
        f"但未在 utility_tasks.md 中找到对应说明章节"
    )
