#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""拉取飞书「商机」里全部课题组（名称含「课题组」），供待补清单下拉用。

输出：数据/ketizu_list.json
"""
import io
import json
import math
import os
import re
import subprocess
import time

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
OUT = os.path.join(ROOT, '数据', 'ketizu_list.json')
PIPELINE = os.path.join(ROOT, '数据', 'mcp_activities_pipeline.py')
PK = '6593cd71471290e3cc6be6e6'

src = io.open(PIPELINE, encoding='utf-8').read()
TK = re.search(r'TK\s*=\s*"([^"]+)"', src).group(1)


def mcp(method, args, timeout=90):
    r = subprocess.run(
        ['curl', '-s', '--resolve', 'project.feishu.cn:443:120.233.177.47', '-X', 'POST',
         'https://project.feishu.cn/mcp_server/v1',
         '-H', 'X-Mcp-Token: %s' % 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)
    try:
        d = json.loads(r.stdout)
    except Exception:
        return None
    for c in (d.get('result') or {}).get('content') or []:
        t = c.get('text', '')
        if t.strip().startswith('{'):
            try:
                return json.loads(t)
            except Exception:
                continue
    return None


def scalar(f):
    vt = f.get('value_type')
    v = f.get('value') or {}
    if vt == 'key_label_value':
        return ((v.get('key_label_value') or {}).get('label') or '').strip()
    if vt == 'key_label_value_list':
        return '、'.join((x.get('label') or '') for x in (v.get('key_label_value_list') or []))
    if vt == 'string_value':
        return (v.get('string_value') or '').strip()
    if vt == 'long_value':
        return str(v.get('long_value', '')).strip()
    for k in v:
        x = v[k]
        if isinstance(x, dict):
            for kk in ('label', 'string_value', 'long_value'):
                if x.get(kk) not in (None, ''):
                    return str(x[kk]).strip()
        elif x not in (None, ''):
            return str(x).strip()
    return ''


def rows_of(res):
    out = []
    data = (res or {}).get('data')
    groups = list(data.values()) if isinstance(data, dict) else (data if isinstance(data, list) else [])
    for g in groups:
        if isinstance(g, dict):
            g = g.get('moql_field_list') or []
        if not isinstance(g, list):
            continue
        for item in g:
            fld = {}
            for f in item.get('moql_field_list') or []:
                fld[f.get('name') or f.get('key')] = scalar(f)
            if fld:
                out.append(fld)
    return out


MQL = "SELECT `名称`, `课题组模式`, `一级课题组` FROM `销售管理`.`商机`"
print('拉取商机全量（找课题组）')
res = mcp('search_by_mql', {'project_key': PK, 'mql': MQL})
rows = rows_of(res)
lst = (res.get('list') or [{}])[0]
count = lst.get('count') or len(rows)
sid = res.get('session_id')
gid = ((lst.get('group_infos') or [{}])[0].get('group_id')) or '1'
pages = max(1, int(math.ceil(count / 50.0)))
print('  总 %d 条 / %d 页' % (count, pages))
for p in range(2, pages + 1):
    r2 = mcp('search_by_mql', {'project_key': PK, 'session_id': sid,
                               'group_pagination_list': [{'group_id': gid, 'page_num': p}]})
    got = rows_of(r2) if r2 else []
    if not got:
        break
    rows.extend(got)
    if p % 10 == 0 or p == pages:
        print('  第 %d/%d 页 ｜ 累计 %d' % (p, pages, len(rows)))
    time.sleep(0.15)

kt = {}
for r in rows:
    n = (r.get('名称') or '').strip()
    if '课题组' in n:
        kt[n] = {'模式': (r.get('课题组模式') or '').strip(), '一级': (r.get('一级课题组') or '').strip()}

payload = {'generated': time.strftime('%Y-%m-%d %H:%M:%S'),
           'src': '飞书 销售管理.商机（名称含「课题组」）',
           'total_story': len(rows), 'ketizu_count': len(kt), 'ketizu': kt}
io.open(OUT, 'w', encoding='utf-8').write(json.dumps(payload, ensure_ascii=False, indent=1))
from collections import Counter
print('\n商机 %d 条 ｜ 识别课题组 %d 个' % (len(rows), len(kt)))
print('  课题组模式分布:', dict(Counter(v['模式'] or '(未填)' for v in kt.values())))
print('  样例:', list(kt)[:12])
print('  → %s' % OUT)
