#!/usr/bin/env python3
"""销售订单数据管道 — MCP拉取→mcp_orders_input.json→顺丰物流
用法: python3 pull_orders.py [--days N]
输出: mcp_orders_input.json
"""
import subprocess, json, os, sys
from datetime import datetime, timedelta, date

TK = "m-abfb29e8-3104-434f-9944-8d0bb592f8cd"
PK = "6593cd71471290e3cc6be6e6"
BASE = os.path.dirname(os.path.abspath(__file__))
OUTPUT = os.path.join(BASE, "mcp_orders_input.json")
DAYS = int(sys.argv[2]) if len(sys.argv) > 2 and sys.argv[1] == '--days' else 90
TODAY = date.today()
START = (TODAY - timedelta(days=DAYS)).strftime('%Y-%m-%d')

def mcp(method, args):
    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=30)
    try:
        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
            return json.loads(t)
    except: return None

def parse_items(result):
    items = []
    if not result: return items
    for gid, gitems in result.get('data', {}).items():
        for item in gitems:
            fields = {}
            for f in item.get('moql_field_list', []):
                k = f['key']
                v = f.get('value')
                if v is None: fields[k] = ''
                elif 'string_value' in v: fields[k] = v['string_value']
                elif 'double_value' in v: fields[k] = v['double_value']
                elif 'long_value' in v: fields[k] = v['long_value']
                elif 'key_label_value' in v: fields[k] = v['key_label_value']
                elif 'user_value' in v: fields[k] = v['user_value']
                else: fields[k] = ''
            items.append(fields)
    return items

COLUMNS = 'name, start_time, field_96a245, field_e1001d, field_51d592, work_item_id, owner, field_3f38c1'

all_items = []
seen = set()
page = 0
print(f"[{datetime.now().strftime('%H:%M:%S')}] 拉取 {START}~ 销售订单...")
while page < 200:
    offset = page * 50
    mql = f"SELECT {COLUMNS} FROM `销售管理`.`销售订单` WHERE start_time >= \"{START}\" ORDER BY start_time DESC LIMIT 50 OFFSET {offset}"
    result = mcp("search_by_mql", {"project_key": PK, "mql": mql})
    if not result: break
    items = parse_items(result)
    if not items: break
    new = []
    for i in items:
        wid = str(i.get('work_item_id', ''))
        if wid and wid not in seen:
            seen.add(wid)
            new.append(i)
    all_items.extend(new)
    page += 1
    if len(items) < 50: break
    if page % 5 == 0:
        print(f"  page {page}: +{len(new)} (total {len(all_items)})")

print(f"  共 {len(all_items)} 条")

# 客户→销售员映射（从MCP客户数据 + ERP _key_customers 双重兜底）
cust_file = os.path.join(BASE, 'mcp_customers.json')
sales_map = {}
# 1. MCP客户owner
if os.path.exists(cust_file):
    custs = json.load(open(cust_file, encoding='utf-8')).get('customers', [])
    for c in custs:
        owner = c.get('owner', '')
        name = c.get('name', '')
        if isinstance(owner, dict) and owner.get('email') and '@biori.com' in owner.get('email', ''):
            sales_map[name] = owner
# 2. ERP _key_customers 兜底（按 salesperson 字段）
erp_file = os.path.join(BASE, 'pricing', '_key_customers.json')
if os.path.exists(erp_file):
    erp = json.load(open(erp_file, encoding='utf-8'))
    for c in erp:
        sp = c.get('salesperson', '')
        if sp and c.get('name') and c['name'] not in sales_map:
            sales_map[c['name']] = {'name_cn': sp, 'email': ''}

print(f"  销售员映射: {len(sales_map)} 客户", file=sys.stderr)

# 转为 shipment_pipeline.py 期望的格式
output = []
for o in all_items:
    customer = o.get('field_e1001d', '')
    if isinstance(customer, dict):
        customer = customer.get('label', '')
    # 销售员：优先从客户owner匹配
    sales = sales_map.get(customer, {})
    owner_name = sales.get('name_cn', sales.get('name_en', ''))
    owner_email = sales.get('email', '')
    output.append({
        '单据编号': o.get('name', ''),
        '购货单位#': customer,
        '销售订单关联客户': customer,
        '创建时间': o.get('start_time', ''),
        '物流单号': o.get('field_96a245', ''),
        '金额': o.get('field_51d592', 0),
        '工作项id': str(o.get('work_item_id', '')),
        '创建者': owner_name,
        '创建者邮箱': owner_email,
        '收货人联系电话#': o.get('field_3f38c1', ''),
    })

with open(OUTPUT, 'w', encoding='utf-8') as f:
    json.dump(output, f, ensure_ascii=False)

print(f"✅ 写入 {OUTPUT} ({len(output)} 条)")
