#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
三级分类优化效果测试

测试优化后的分类器对"验收内容"等内容的分类效果
"""

import asyncio
import sys
from pathlib import Path

project_root = Path(__file__).parent.parent.parent
sys.path.insert(0, str(project_root))

from core.construction_review.component.reviewers.utils.llm_content_classifier_v2 import (
    ContentClassifierClient,
    SectionContent,
    CategoryStandardLoader,
    SecondCategoryStandardLoader
)


async def test_classification_optimization():
    """测试分类优化效果"""

    print("=" * 60)
    print("三级分类优化效果测试")
    print("=" * 60)

    # 加载标准分类
    csv_path = project_root / "core/construction_review/component/doc_worker/config/StandardCategoryTable.csv"
    loader = CategoryStandardLoader(csv_path)

    second_csv_path = project_root / "core/construction_review/component/doc_worker/config/construction_plan_standards.csv"
    second_loader = SecondCategoryStandardLoader(second_csv_path) if second_csv_path.exists() else None

    # 创建分类客户端
    classifier = ContentClassifierClient(
        model="qwen3.5-122b-a10b",
        semaphore=asyncio.Semaphore(5),
        embedding_client=None,
        second_category_loader=second_loader
    )

    # 测试用例1: 验收内容
    print("\n" + "-" * 60)
    print("测试用例1: 验收内容分类")
    print("-" * 60)

    test_content_1 = """<1> 三、验收内容
<2> 针对项目认定的关键工序进行验收，按照相关规范进行验收，其检验方法：检
<3> 查质量证明文件、观察、尺量、测量、砼强度检测等。验收内容及合格标准如下：
<4> 1、材料、机具检查验收对所有材料和机械进行进场登记验收，清退不合格材料和机械。
<5> 2、钢筋、预应力钢绞线、锚夹具、波纹管、压浆料、起吊钢绳、吊具等材料应具有出厂质量证明书和试验报告单。
<6> 3、进场时除检查其外观和标志外，按不同的品种、等级、牌号、规格及生产厂家分批抽取试样进行性能检验。
<7> 4、检验试验方法应符合现行国家标准的规定。
<8> 5、施工工艺验收包括模板安装工艺验收、混凝土浇筑工艺验收等。
<9> 6、机械设备验收包括塔式起重机验收、混凝土泵车验收等。
<10> 7、临时支撑结构验收包括脚手架验收、满堂支架验收等。"""

    lines = test_content_1.strip().split('\n')
    standards = loader.get_standards_by_second_code("Content")  # 验收内容

    section = SectionContent(
        section_key="test_acceptance",
        section_name="验收内容",
        lines=lines,
        numbered_content=test_content_1,
        category_standards=standards,
        line_number_map=list(range(1, len(lines) + 1))
    )

    print(f"二级分类: 验收内容 (Content)")
    print(f"三级分类标准数量: {len(standards)}")
    print(f"测试内容行数: {len(lines)}")

    if standards:
        print(f"\n三级分类标准列表:")
        for std in standards[:5]:
            print(f"  - {std.third_name} ({std.third_code})")

    # 调用分类器
    result = await classifier.classify_content(section)

    print(f"\n分类结果:")
    print(f"  成功: {result.error is None}")
    print(f"  耗时: {result.latency:.2f}s")
    print(f"  分类数量: {len(result.classified_contents)}")
    print(f"  分类率: {result.coverage_rate:.1f}%")

    if result.classified_contents:
        print(f"\n识别到的三级分类:")
        for content in result.classified_contents:
            print(f"  - {content.third_category_name} ({content.third_category_code})")
            print(f"    行号: {content.start_line} - {content.end_line}")

    # 检查是否误分类为"非标准项"
    no_standard_count = sum(1 for c in result.classified_contents if c.third_category_code == "no_standard")
    standard_count = len(result.classified_contents) - no_standard_count

    print(f"\n分类统计:")
    print(f"  标准分类: {standard_count}")
    print(f"  非标准项: {no_standard_count}")

    if no_standard_count > standard_count:
        print(f"  [警告] 非标准项分类过多!")
    else:
        print(f"  [OK] 标准分类占多数")

    print("\n" + "=" * 60)
    print("测试完成")
    print("=" * 60)


if __name__ == "__main__":
    asyncio.run(test_classification_optimization())