#!/usr/bin/env python3
"""MCP → 每日活动JSON v2：诊断原料 + 生命科学 双线
- 去处重、全量拉取
- 课题组=生命科学，其他=诊断原料
- 输出 daily_activities_mcp.json（兼容现有格式）
"""

import subprocess, json, re, time, os
from datetime import datetime
from collections import defaultdict

TK = "m-abfb29e8-3104-434f-9944-8d0bb592f8cd"
SALES_PK = "6593cd71471290e3cc6be6e6"
BASE = "/Users/liuxinyuan/Desktop/Hermes输出-工作类/数据"

def mcp(method, args, timeout=30):
    r = subprocess.run(['curl','-s','--resolve','project.feishu.cn:443:120.233.177.47','-X','POST','https://project.feishu.cn/mcp_server/v1',
        '-H',f'X-Mcp-Token: {TK}','-H','Content-Type: application/json',
        '-d', json.dumps({"jsonrpc":"2.0","method":"tools/call","params":{"name":method,"arguments":args},"id":1})],
        capture_output=True, text=True, timeout=timeout)
    d = json.loads(r.stdout)
    result = None
    for c in d['result']['content']:
        t = c['text']
        if 'log_id' in t: continue
        if t.startswith('{'): result = json.loads(t)
    return result

def parse_items(result):
    """Parse moql_field_list into flat dicts"""
    items = []
    for gid, gitems in result.get('data', {}).items():
        for item in gitems:
            fields = {}
            for f in item.get('moql_field_list', []):
                k = f['name']
                vdict = f.get('value', {})
                vals = list(vdict.values()) if vdict else ['']
                v = vals[0] if vals else ''
                if isinstance(v, dict):
                    v = list(v.values())[0] if v else ''
                fields[k] = v if v else ''
                # Normalize key
                if k == '工作项id':
                    fields['work_item_id'] = str(v)
                elif k == '名称':
                    fields['name'] = v
            items.append(fields)
    return items

print("=== MQL 拉取销售管理全量story ===")
all_stories = []
seen_ids = set()

# Fetch with OFFSET pagination
MQL_BASE = "SELECT `名称`, description, `创建时间`, `创建者`, work_item_id FROM `销售管理`.`story` ORDER BY `创建时间` DESC"

page = 0
while True:
    offset = page * 50
    mql = f"{MQL_BASE} LIMIT 50 OFFSET {offset}"
    result = mcp("search_by_mql", {"project_key": SALES_PK, "mql": mql})
    items = parse_items(result)
    
    if not items:
        print(f"  第{page+1}页: 0条，停止")
        break
    
    new_items = []
    for item in items:
        wid = item.get('work_item_id', '')
        if wid and wid not in seen_ids:
            seen_ids.add(wid)
            new_items.append(item)
    
    all_stories.extend(new_items)
    page += 1
    print(f"  第{page}页: 新增{len(new_items)}条 | 累计{len(all_stories)} | 去重{len(items)-len(new_items)}")
    
    if len(items) < 50:
        print(f"  (最后页，停止)")
        break
    if page >= 120: break
    time.sleep(0.3)

print(f"\n✅ 去重后总计: {len(all_stories)}条")

# ═══════════════════════════════════
# Classify: 课题组 = 生命科学, 其他 = 诊断原料
# ═══════════════════════════════════
daily_ls = defaultdict(list)   # 生命科学
daily_diag = defaultdict(list)  # 诊断原料

for story in all_stories:
    name = story.get('name', story.get('名称', ''))
    desc = story.get('description', '')
    created = story.get('创建时间', '')
    creator = story.get('创建者', '')
    wid = story.get('work_item_id', '')
    
    if not created: continue
    date = created[:10]
    
    # Determine business line
    is_pi = '课题组' in name
    
    # Determine type
    atype = '线上跟进'
    if '拜访' in name or '拜访' in (desc or ''):
        atype = '拜访'
    elif '测试' in name or '送样' in name:
        atype = '测试跟进'
    
    activity = {
        'client': name[:80],
        'name': name[:80],
        'desc': (desc or '')[:200],
        'sales': creator,
        'type': atype,
        'dept': '生命科学销售部' if is_pi else '诊断原料销售部',
        'url': f'https://project.feishu.cn/xsguanli/story/detail/{wid}' if wid else '',
        'is_pi': is_pi
    }
    
    if is_pi:
        daily_ls[date].append(activity)
    else:
        daily_diag[date].append(activity)

# Merge both lines for compatible format
all_daily = defaultdict(list)
for d, acts in daily_ls.items():
    all_daily[d].extend(acts)
for d, acts in daily_diag.items():
    all_daily[d].extend(acts)

days_sorted = sorted(all_daily.keys(), reverse=True)

output = {
    'days': days_sorted,
    'daily': dict(all_daily),
    'daily_ls': dict(daily_ls),
    'daily_diag': dict(daily_diag),
    'generated': datetime.now().strftime('%Y-%m-%d %H:%M'),
    'source': '飞书项目MCP',
    'total_records': len(all_stories),
    'by_dept': {
        '生命科学销售部': sum(len(v) for v in daily_ls.values()),
        '诊断原料销售部': sum(len(v) for v in daily_diag.values())
    }
}

outpath = f'{BASE}/daily_activities_mcp.json'
with open(outpath, 'w', encoding='utf-8') as f:
    json.dump(output, f, ensure_ascii=False, default=str)
    
size = os.path.getsize(outpath)
print(f'\n✅ 保存: {outpath} ({size//1024}KB)')
print(f'\n📊 统计:')
print(f'  去重story: {len(all_stories)}条')
print(f'  覆盖天数: {len(days_sorted)}')
print(f'  生命科学: {output["by_dept"]["生命科学销售部"]}条')
print(f'  诊断原料: {output["by_dept"]["诊断原料销售部"]}条')
print(f'  最新: {days_sorted[0] if days_sorted else "N/A"}')
print(f'  最早: {days_sorted[-1] if days_sorted else "N/A"}')
