#!/usr/bin/env python3
"""决策链自动化管理工具"""

import subprocess, json, sys, os
from datetime import datetime

BASE = os.path.dirname(os.path.abspath(__file__))
DATA_FILE = os.path.join(BASE, '数据/decision_chains_auto.json')
INDEX_FILE = os.path.join(BASE, '数据/pricing/_index.json')
TK = 'm-abfb29e8-3104-434f-9944-8d0bb592f8cd'
SALES_PK = '6593cd71471290e3cc6be6e6'

def mcp(method, args, timeout=30):
    r = subprocess.run(['curl','-s','-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)
    if 'error' in d: return None
    for c in d['result']['content']:
        t = c.get('text','')
        if 'log_id' in t: continue
        try: return json.loads(t)
        except: return None
    return None

def get_decision_url(customer_name):
    """查询单个客户的决策链URL"""
    MQL = f'SELECT `客户名称`, `决策链URL链接` FROM `销售管理`.`客户` WHERE `客户名称` = "{customer_name}" LIMIT 1'
    r = mcp('search_by_mql', {'project_key': SALES_PK, 'mql': MQL})
    if not r: return None
    for items in r.get('data', {}).values():
        for item in items:
            for f in item.get('moql_field_list', []):
                if f['name'] == '决策链URL链接':
                    vv = list(f.get('value',{}).values()) if f.get('value') else ['']
                    url = str(vv[0]) if vv else ''
                    return url if url and url != 'None' else ''
    return ''

def set_decision_url(customer_name, url):
    """设置/更新决策链URL
    注意: 决策链URL链接是表单模板字段，update_field API可能无法写入。
    此功能需要飞书Open API或手动在飞书页面操作。
    """
    MQL = f'SELECT work_item_id FROM `销售管理`.`客户` WHERE `客户名称` = "{customer_name}" LIMIT 1'
    r = mcp('search_by_mql', {'project_key': SALES_PK, 'mql': MQL})
    if not r: return False
    wid = None
    for items in r.get('data', {}).values():
        for item in items:
            for f in item.get('moql_field_list', []):
                if f['name'] == '工作项id':
                    vv = list(f.get('value',{}).values()) if f.get('value') else ['']
                    wid = str(vv[0]) if vv else None
    if not wid: return False
    
    result = mcp('update_field', {
        'project_key': SALES_PK,
        'work_item_id': wid,
        'fields': [{'key': '决策链URL链接', 'value': url}]
    })
    # update_field returns empty mcp_result for template fields — write may not persist
    return result is not None

def load_customers():
    """加载价格表中有数据的客户"""
    with open(INDEX_FILE) as f:
        index = json.load(f)
    return [c for c in index if c.get('has_data', True)]

def cmd_scan(args):
    limit = 50
    for i, a in enumerate(args):
        if a == '--limit' and i+1 < len(args):
            limit = int(args[i+1])
    
    customers = load_customers()[:limit]
    results = []
    for i, cust in enumerate(customers):
        url = get_decision_url(cust['name'])
        results.append({
            'customer': cust['name'],
            'pricing_total': cust['total'],
            'decision_url': url,
            'has_decision_chain': bool(url),
        })
        if (i+1) % 10 == 0:
            print(f"  {i+1}/{len(customers)}...")
    
    with_chain = [r for r in results if r['has_decision_chain']]
    data = {'updated': datetime.now().isoformat()[:19], 'total_scanned': len(results),
            'with_chain': len(with_chain), 'without_chain': len(results)-len(with_chain), 'results': results}
    with open(DATA_FILE, 'w') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    
    print(f"\n✅ 扫描完成: {len(results)}家, 有决策链 {len(with_chain)}, 缺失 {len(results)-len(with_chain)}")
    print(f"   数据已保存: {DATA_FILE}")

def cmd_get(args):
    if not args: return print("用法: get 客户名称")
    url = get_decision_url(args[0])
    if url is None: print(f"❌ 未找到客户: {args[0]}")
    elif url: print(f"📋 {args[0]}\n   {url}")
    else: print(f"⚠️ {args[0]}: 无决策链")

def cmd_set(args):
    if len(args) < 2: return print("用法: set 客户名称 URL")
    ok = set_decision_url(args[0], args[1])
    print(f"{'✅ 已更新' if ok else '❌ 失败'}: {args[0]}")

def cmd_clear(args):
    if not args: return print("用法: clear 客户名称")
    ok = set_decision_url(args[0], '')
    print(f"{'✅ 已清空' if ok else '❌ 失败'}: {args[0]}")

def cmd_missing(args=None):
    if not os.path.exists(DATA_FILE):
        print("请先运行 scan")
        return
    with open(DATA_FILE) as f:
        data = json.load(f)
    missing = [r for r in data['results'] if not r['has_decision_chain']]
    missing.sort(key=lambda x: -x['pricing_total'])
    print(f"⚠️ 缺失决策链: {len(missing)}家")
    for r in missing:
        print(f"  {r['customer'][:35]:35s} | {r['pricing_total']/1e4:.0f}万")

def cmd_export(args):
    fmt = 'json'
    if '--format' in args:
        idx = args.index('--format')
        if idx+1 < len(args): fmt = args[idx+1]
    
    if not os.path.exists(DATA_FILE):
        print("请先运行 scan")
        return
    with open(DATA_FILE) as f:
        data = json.load(f)
    
    if fmt == 'csv':
        print("客户名称,累计采购,决策链URL,状态")
        for r in data['results']:
            status = '已填写' if r['has_decision_chain'] else '缺失'
            print(f'"{r["customer"]}",{r["pricing_total"]},"{r["decision_url"]}",{status}')
    else:
        print(json.dumps(data, ensure_ascii=False, indent=2))

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print(__doc__)
        sys.exit(0)
    cmd = sys.argv[1]
    args = sys.argv[2:]
    {'scan': cmd_scan, 'get': cmd_get, 'set': cmd_set,
     'clear': cmd_clear, 'missing': cmd_missing, 'export': cmd_export}.get(cmd, lambda a: print(f"未知命令: {cmd}"))(args)
