from django.urls import reverse
from django.test import override_settings
from django.contrib import admin

from apps.platform_ui.services import get_platform_demo_context
from apps.platform_ui.models import FeishuNotifyConfig, OwnerMapping, WordTemplateMapping


def test_knowledge_base_page_shows_governance_sections(client):
    response = client.get(reverse("platform_ui:knowledge-base"))

    content = response.content.decode("utf-8")
    assert response.status_code == 200
    assert "法规规则包" in content
    assert "RAG 文档源" in content
    assert "RAG 切片" in content
    assert "字段 Schema" in content
    assert "责任人映射" in content
    assert "飞书通知配置" in content


def test_knowledge_base_page_shows_owner_mapping_fields_and_notify_reasons(client):
    response = client.get(reverse("platform_ui:knowledge-base"))

    content = response.content.decode("utf-8")
    assert response.status_code == 200
    assert "owner_role" in content
    assert "owner_name" in content
    assert "department" in content
    assert "chapter_scope" in content
    assert "risk_scope" in content
    assert "feishu_user_id" in content
    assert "feishu_open_id" in content
    assert "feishu_name" in content
    assert "notify_enabled" in content
    assert "task_completed" in content
    assert "task_failed" in content


@override_settings(GOVERNANCE_CONFIG_PATH="")
def test_get_platform_demo_context_reads_governance_yaml(tmp_path):
    config_path = tmp_path / "governance.yaml"
    config_path.write_text(
        """
owner_mappings:
  - owner_role: 临床注册负责人
    owner_name: 王五
    department: 临床事务部
    chapter_scope: CH3-CH6
    risk_scope: 高风险阻断
    feishu_user_id: ou_test_owner
    feishu_open_id: on_test_owner
    feishu_name: 王五
    notify_enabled: 是
feishu_configs:
  - config_name: Demo 完成通知
    notify_reason: task_completed
    channel: 群机器人
    message_template: 审核完成摘要 + @处理人
    status: 启用
template_mappings:
  - template_name: 注册证导出模板
    output_type: registration_word_export_report
    version: V1.0
    placeholder_count: 12
    status: 启用
    field_mapping_summary: 产品名称 / 注册人 / 适用机型
""".strip(),
        encoding="utf-8",
    )

    with override_settings(GOVERNANCE_CONFIG_PATH=config_path):
        context = get_platform_demo_context()

    assert context["owner_mappings"][0]["owner_name"] == "王五"
    assert context["feishu_configs"][0]["notify_reason"] == "task_completed"
    assert context["template_mappings"][0]["template_name"] == "注册证导出模板"
    assert context["template_mappings"][0]["field_mapping_summary"] == "产品名称 / 注册人 / 适用机型"


@override_settings(GOVERNANCE_CONFIG_PATH="")
def test_knowledge_base_page_shows_template_mappings_from_governance_config(client, tmp_path):
    config_path = tmp_path / "governance.yaml"
    config_path.write_text(
        """
template_mappings:
  - template_name: 风险摘要导出模板
    output_type: registration_word_export_report
    version: V2.0
    placeholder_count: 8
    status: 灰度中
    field_mapping_summary: 风险等级 / 产品名称 / 责任人
""".strip(),
        encoding="utf-8",
    )

    with override_settings(GOVERNANCE_CONFIG_PATH=config_path):
        response = client.get(reverse("platform_ui:knowledge-base"))

    content = response.content.decode("utf-8")
    assert response.status_code == 200
    assert "Word 模板与字段映射" in content
    assert "风险摘要导出模板" in content
    assert "风险等级 / 产品名称 / 责任人" in content


def test_get_platform_demo_context_prefers_database_governance_entries(db):
    OwnerMapping.objects.create(
        owner_role="数据库负责人",
        owner_name="周八",
        department="注册事务部",
        chapter_scope="CH5",
        risk_scope="数据库覆盖",
        feishu_user_id="ou_db_1",
        feishu_open_id="on_db_1",
        feishu_name="周八",
        notify_enabled=True,
        is_active=True,
    )
    FeishuNotifyConfig.objects.create(
        config_name="数据库通知配置",
        notify_reason="task_failed",
        channel="群机器人",
        message_template="异常摘要 + @处理人",
        status="启用",
        is_active=True,
    )
    WordTemplateMapping.objects.create(
        template_name="数据库模板",
        output_type="registration_word_export_report",
        version="V3.0",
        placeholder_count=16,
        status="启用",
        field_mapping_summary="产品名称 / 规格 / 风险等级",
        is_active=True,
    )

    context = get_platform_demo_context()

    assert context["owner_mappings"][0]["owner_name"] == "周八"
    assert context["feishu_configs"][0]["config_name"] == "数据库通知配置"
    assert context["template_mappings"][0]["template_name"] == "数据库模板"


def test_governance_models_are_registered_in_admin():
    assert OwnerMapping in admin.site._registry
    assert FeishuNotifyConfig in admin.site._registry
    assert WordTemplateMapping in admin.site._registry


def test_knowledge_base_page_shows_governance_object_navigation_and_active_panel(client):
    response = client.get(reverse("platform_ui:knowledge-base"), {"view": "owner_mappings"})

    content = response.content.decode("utf-8")
    assert response.status_code == 200
    assert "治理对象导航" in content
    assert "法规规则包" in content
    assert "RAG 文档源" in content
    assert "Word 模板与字段映射" in content
    assert "责任人映射详情" in content
    assert "当前对象：责任人映射" in content
    assert "批量导入映射" in content


def test_knowledge_base_page_exposes_governance_crud_entry_links(client):
    response = client.get(reverse("platform_ui:knowledge-base"), {"view": "template_mappings"})

    content = response.content.decode("utf-8")
    assert response.status_code == 200
    assert "上传模板" in content
    assert "编辑占位符映射" in content
    assert "预览模板" in content
    assert reverse("admin:platform_ui_wordtemplatemapping_changelist") in content
