#!/usr/bin/env python3
"""
演示不同算分方法的效果
"""
import asyncio
from lib.text_embedding import compare_phrases
import time


async def demo_default_method():
    """演示默认算分方法"""
    print("=" * 70)
    print("1. 默认算分方法: ai_direct")
    print("=" * 70)
    print()

    print("默认情况下，compare_phrases() 使用 AI 直接判断语义相似度")
    print("这与 semantic_similarity.py 的方法完全相同\n")

    phrase_a = "深度学习"
    phrase_b = "神经网络"

    print(f"测试短语: 【{phrase_a}】 vs 【{phrase_b}】\n")

    # 不指定 method，使用默认值 ai_direct
    result = await compare_phrases(phrase_a, phrase_b)

    print("返回结果:")
    print(f"  相似度: {result['相似度']}")
    print(f"  说明: {result['说明']}")
    print()

    print("工作原理:")
    print("  1. AI 读取两个短语")
    print("  2. AI 理解它们的语义")
    print("  3. AI 直接给出相似度分数和理由")
    print()


async def demo_all_methods():
    """演示所有算分方法"""
    print("=" * 70)
    print("2. 对比所有算分方法")
    print("=" * 70)
    print()

    test_pairs = [
        ("深度学习", "神经网络"),
        ("机器学习", "人工智能"),
        ("Python编程", "Java开发"),
        ("今天吃饭", "深度学习"),
    ]

    methods = {
        "ai_direct": "AI 直接判断（默认）",
        "cosine": "余弦相似度",
        "euclidean": "欧氏距离",
        "manhattan": "曼哈顿距离",
        "dot_product": "点积相似度",
    }

    for pair_idx, (phrase_a, phrase_b) in enumerate(test_pairs, 1):
        print(f"\n测试 {pair_idx}: 【{phrase_a}】 vs 【{phrase_b}】")
        print("-" * 70)

        results = []
        for method, description in methods.items():
            result = await compare_phrases(
                phrase_a, phrase_b,
                method=method,
                dim=128  # 使用较小维度加快测试
            )
            results.append((method, description, result['相似度']))

        # 按相似度排序
        results.sort(key=lambda x: x[2], reverse=True)

        for method, description, score in results:
            bar = "█" * int(score * 30)  # 可视化
            print(f"  {description:25s} {score:.3f} {bar}")

        print()


async def demo_speed_comparison():
    """演示不同方法的速度对比"""
    print("=" * 70)
    print("3. 速度对比（缓存机制演示）")
    print("=" * 70)
    print()

    phrase_a = "测试文本A"
    phrase_b = "测试文本B"

    print(f"测试短语: 【{phrase_a}】 vs 【{phrase_b}】\n")

    # 第一次调用（无缓存）
    print("第一次调用（无缓存）:")
    start = time.time()
    result1 = await compare_phrases(phrase_a, phrase_b)
    time1 = time.time() - start
    print(f"  耗时: {time1:.2f} 秒")
    print(f"  相似度: {result1['相似度']}")
    print()

    # 第二次调用（有缓存）
    print("第二次调用（有缓存）:")
    start = time.time()
    result2 = await compare_phrases(phrase_a, phrase_b)
    time2 = time.time() - start
    print(f"  耗时: {time2:.2f} 秒")
    print(f"  相似度: {result2['相似度']}")
    print(f"  加速比: {time1/time2:.1f}x")
    print()

    print("结论:")
    print("  - 首次调用需要请求 AI，耗时较长")
    print("  - 缓存命中后，速度极快（几乎瞬间）")
    print("  - 生产环境中，缓存大幅降低成本和延迟")
    print()


async def demo_accuracy_vs_speed():
    """演示准确度 vs 速度的权衡"""
    print("=" * 70)
    print("4. 准确度 vs 速度权衡")
    print("=" * 70)
    print()

    test_cases = [
        ("深度学习", "神经网络", "高度相关"),
        ("机器学习", "人工智能", "相关"),
        ("Python", "Java", "弱相关"),
        ("编程", "吃饭", "不相关"),
    ]

    print("测试不同语义关系的短语对:\n")

    for phrase_a, phrase_b, relation in test_cases:
        print(f"【{phrase_a}】 vs 【{phrase_b}】 (预期: {relation})")

        # AI 直接判断（最准确）
        result_ai = await compare_phrases(phrase_a, phrase_b, method="ai_direct")

        # 余弦相似度（次准确）
        result_cosine = await compare_phrases(phrase_a, phrase_b, method="cosine", dim=128)

        print(f"  AI 判断:    {result_ai['相似度']:.3f} - {result_ai['说明'][:40]}...")
        print(f"  余弦相似度: {result_cosine['相似度']:.3f}")

        # 对比差异
        diff = abs(result_ai['相似度'] - result_cosine['相似度'])
        print(f"  差异:       {diff:.3f}")
        print()

    print("结论:")
    print("  - AI 直接判断: 准确度最高，能给出详细理由")
    print("  - 余弦相似度: 速度更快，但可能不如 AI 准确")
    print("  - 建议: 默认使用 AI 直接判断，批量计算时考虑余弦")
    print()


async def demo_method_selection_guide():
    """演示如何选择算分方法"""
    print("=" * 70)
    print("5. 算分方法选择指南")
    print("=" * 70)
    print()

    print("┌─────────────────────────────────────────────────────────┐")
    print("│ 场景                         │ 推荐方法                │")
    print("├─────────────────────────────────────────────────────────┤")
    print("│ 日常使用，追求准确度          │ ai_direct (默认)  ⭐    │")
    print("│ 批量计算，已有向量            │ cosine                  │")
    print("│ 需要详细解释原因              │ ai_direct (默认)        │")
    print("│ 对成本敏感，大量计算          │ cosine                  │")
    print("│ 与 semantic_similarity 兼容   │ ai_direct (默认)        │")
    print("│ 需要稳定可复现的结果          │ cosine/euclidean        │")
    print("└─────────────────────────────────────────────────────────┘")
    print()

    print("使用建议:")
    print()
    print("1️⃣  99% 的情况，直接用默认值（不传 method 参数）")
    print("   result = await compare_phrases('A', 'B')  # 使用 ai_direct")
    print()
    print("2️⃣  批量计算时，可以考虑 cosine")
    print("   result = await compare_phrases('A', 'B', method='cosine')")
    print()
    print("3️⃣  不确定时，用默认值就对了！")
    print()


async def main():
    """运行所有演示"""

    print("\n")
    print("╔══════════════════════════════════════════════════════════════════╗")
    print("║             默认算分逻辑演示 - text_embedding.py                ║")
    print("╚══════════════════════════════════════════════════════════════════╝")
    print()

    # 1. 默认方法
    await demo_default_method()

    input("按回车继续下一个演示...")
    print("\n")

    # 2. 对比所有方法
    await demo_all_methods()

    input("按回车继续下一个演示...")
    print("\n")

    # 3. 速度对比
    await demo_speed_comparison()

    input("按回车继续下一个演示...")
    print("\n")

    # 4. 准确度 vs 速度
    await demo_accuracy_vs_speed()

    input("按回车继续下一个演示...")
    print("\n")

    # 5. 选择指南
    await demo_method_selection_guide()

    print("=" * 70)
    print("所有演示完成！")
    print("=" * 70)
    print()
    print("核心结论:")
    print("  ✅ 默认使用 ai_direct（不需要指定 method 参数）")
    print("  ✅ 与 semantic_similarity.py 完全兼容")
    print("  ✅ 有缓存机制，第二次调用极快")
    print("  ✨ 支持多种算分方法，按需选择")
    print()


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