#!/usr/bin/env python3
"""
宝锐生物 · 诊断原料市场调研 Agent
====================================
每周自动运行，采集竞品情报，输出 Markdown 市场情报 KB，部署到 CloudBase。

数据源:
  1. Web 搜索（Hermes web_search）
  2. 飞书 MCP 数据（客诉/活动/商机中与竞品相关的内容）
  3. Ollama (qwen3:8b) 本地整合分析

输出: 数据/market_intel/{日期}_市场情报.md
CloudBase: 数据/market_intel/latest.md（最新版覆盖）
"""

import json, os, subprocess, sys, re
from datetime import datetime, timedelta
from collections import defaultdict

# ============ 配置 ============
COMPETITORS = ['诺唯赞', '翌圣', '康为世纪', '全式金', 'Takara', 'NEB', '赛默飞', 'Thermo Fisher']
WORK_DIR = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
DATA_DIR = os.path.join(WORK_DIR, '数据')
OUTPUT_DIR = os.path.join(DATA_DIR, 'market_intel')
MCP_DIR = DATA_DIR  # MCP data files location

# ============ Step 1: Web 搜索 ============
def load_web_results():
    """加载 Hermes web_search 结果（从 JSON 文件）"""
    web_file = os.path.join(OUTPUT_DIR, 'web_search_raw.json')
    if os.path.exists(web_file):
        with open(web_file) as f:
            return json.load(f)
    return {}

# ============ Step 2: MCP 数据提取 ============
def extract_mcp_competitor_data():
    """从 MCP JSON 文件中提取与竞品相关的内容"""
    print("[2/4] MCP 数据提取...")
    results = defaultdict(list)
    
    # 客诉
    try:
        complaints = json.load(open(os.path.join(MCP_DIR, 'mcp_complaints.json')))
        for item in complaints.get('items', []):
            text = json.dumps(item, ensure_ascii=False)
            for comp in COMPETITORS:
                if comp in text:
                    results[f'客诉-{comp}'].append({
                        'name': item.get('name', ''),
                        'customer': item.get('customer', ''),
                        'creator': item.get('creator', ''),
                        'created_date': item.get('created_date', ''),
                        'status': item.get('status', ''),
                    })
    except Exception as e:
        print(f"  ⚠️ 客诉加载失败: {e}")
    
    # 商机
    try:
        opps = json.load(open(os.path.join(MCP_DIR, 'opportunity_sandbox.json')))
        for item in opps.get('opportunities', []):
            text = json.dumps(item, ensure_ascii=False)
            for comp in COMPETITORS:
                if comp in text:
                    results[f'商机-{comp}'].append({
                        'name': item.get('name', ''),
                        'customer': item.get('customer', ''),
                        'sales': item.get('sales', ''),
                        'target': item.get('target', 0),
                        'type': item.get('type', ''),
                    })
    except Exception as e:
        print(f"  ⚠️ 商机加载失败: {e}")
    
    for key, items in results.items():
        print(f"  {key}: {len(items)} 条")
    
    return dict(results)

# ============ Step 3: Ollama 整合分析 ============
def ollama_analyze(web_data, mcp_data):
    """通过本地 Ollama 整合分析"""
    print("[3/4] Ollama 整合分析...")
    
    web_text = json.dumps(web_data, ensure_ascii=False, indent=1) if web_data else '（无Web搜索数据）'
    mcp_text = json.dumps(mcp_data, ensure_ascii=False, indent=1) if mcp_data else '（无MCP数据）'
    
    prompt = f"""你是一个生物医药行业市场分析专家。请根据以下信息，输出一份诊断原料竞品市场情报报告。

## 竞品名单
{', '.join(COMPETITORS)}

## Web 搜索最新情报
{web_text[:4000]}

## MCP飞书数据中与竞品相关的记录
{mcp_text[:2000]}

## 要求
1. 按竞品分组，每组包含：公司概况、最新动态（优先用Web搜索数据，标注日期）、在MCP中的出现频次、正面/负面信号
2. 标注可靠性（🟢确定/🟡推测/🔵待确认）
3. 对宝锐生物的业务启示（具体可执行建议）
4. 输出纯 Markdown 格式，不要代码块包裹
5. 不要输出思考过程，直接输出报告"""

    try:
        result = subprocess.run(
            ['ollama', 'run', 'qwen3:8b', prompt],
            capture_output=True, text=True, timeout=120
        )
        if result.returncode == 0:
            text = result.stdout.strip()
            # 清理思考过程
            import re as regex
            text = regex.sub(r'^Thinking\.\.\..*?\.\.\.done thinking\.\n', '', text, flags=regex.DOTALL|regex.MULTILINE)
            text = regex.sub(r'\x1b\[[0-9;]*[a-zA-Z]', '', text)
            # 去重（Thermo Fisher = 赛默飞）
            text = text.replace('## **Thermo Fisher（与赛默飞同名', '<!-- Thermo Fisher 与赛默飞重复，已合并 -->')
            print(f"  ✅ Ollama 返回 {len(text)} 字符（已清理）")
            return text.strip()
        else:
            print(f"  ⚠️ Ollama 错误: {result.stderr[:200]}")
            return None
    except subprocess.TimeoutExpired:
        print("  ⚠️ Ollama 超时")
        return None
    except FileNotFoundError:
        print("  ⚠️ Ollama 未安装或不在 PATH 中")
        return None

# ============ Step 4: 输出 & 部署 ============
def output_and_deploy(markdown_content):
    """保存 Markdown 并提示部署"""
    print("[4/4] 输出 & 部署...")
    
    today = datetime.now().strftime('%Y%m%d')
    os.makedirs(OUTPUT_DIR, exist_ok=True)
    
    # Weekly version
    filename = os.path.join(OUTPUT_DIR, f'{today}_市场情报.md')
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(markdown_content)
    print(f"  📄 已保存: {filename}")
    
    # Latest version (overwrite)
    latest = os.path.join(OUTPUT_DIR, 'latest.md')
    with open(latest, 'w', encoding='utf-8') as f:
        f.write(markdown_content)
    print(f"  📄 已更新: {latest}")
    
    # Deploy command
    print(f"\n  部署到 CloudBase:")
    print(f"  tcb hosting deploy '{filename}' '数据/market_intel/{today}_市场情报.md' -e bier-sales-d0gatbvlx288724e9")
    print(f"  tcb hosting deploy '{latest}' '数据/market_intel/latest.md' -e bier-sales-d0gatbvlx288724e9")

# ============ Main ============
if __name__ == '__main__':
    print("=" * 50)
    print("宝锐生物 · 诊断原料市场调研 Agent")
    print(f"运行时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}")
    print("=" * 50)
    
    # Step 1: Load web search results
    web_result = load_web_results()
    print(f"  Web数据: {len(web_result)} 条" if web_result else "  Web数据: 未加载，使用默认")
    
    # Step 2: MCP extraction
    mcp_result = extract_mcp_competitor_data()
    
    # Step 3: Ollama analysis
    markdown = ollama_analyze(web_result, mcp_result)
    
    if markdown:
        output_and_deploy(markdown)
        print("\n✅ 完成")
    else:
        print("\n⚠️ Ollama 分析失败，仅输出原始数据")
        raw_md = f"# 诊断原料竞品市场情报\n\n> 生成: {datetime.now().isoformat()}\n\n## MCP 原始数据\n\n```json\n{json.dumps(mcp_result, ensure_ascii=False, indent=2)}\n```\n\n*Web搜索数据由 Hermes 补充*"
        output_and_deploy(raw_md)
