import json, os, re, urllib.request, copy
from datetime import datetime

DEEPSEEK_URL = 'https://api.deepseek.com/v1/chat/completions'
INPUT = '/data/news/json/origin_data/0626data.json'
OUTPUT = '/data/news/json/origin_data/yes_0626data.json'
YES_DIR = '/data/news/json/yes_data/'

def get_ds_key():
    try:
        with open('/root/.openclaw/openclaw.json') as f:
            return json.load(f)['models']['providers']['deepseek']['apiKey']
    except:
        return None

PROMPT = """为以下{count}条{section}评分（0-100）。排除PR软文和疑问句观点文。

{extra_rules}

输出JSON数组：
[{{"idx":1,"scores":{{"hyundai_relevance_score":0,"conversion_value_score":0,"marketing_actionability_score":0,"brand_influence_score":0,"customer_loyalty_score":0,"competitor_threat_score":0,"overall_tag_value_score":0}},"selection_suggestion":"","selection_reason":"15字内","marketing_opportunity":"20字内","event_type":"","business_tags":[],"risk_tags":["无明显风险"],"confidence":0.85}},...]

{item_text}"""

BRAND_EXTRA = "世界杯赛事期间（6月-7月），与世界杯/体育赛事相关的品牌营销案例可适当加分。重点看品牌营销案例的创意和话题度，不用和汽车沾边。排除汽车品牌案例（归车型板块）。PR风格可适当降分但不直接排除。优先保留有话题性、传播力或创新性的营销活动。"
VEHICLE_PROMPT = """为以下{count}条vehicle_hotspots评分（0-100）。

{extra_rules}

只输出JSON数组，每条格式：{{"idx":序号,"scores":{{"overall_tag_value_score":分数}},"selection_reason":"理由"}}

{item_text}"""
SOCIAL_EXTRA = "按热度评分。纯高热度社会事件为主力，非品牌化汽车社会新闻（油价、政策调整等）最多1条，其次选可转化为营销动作的热点（体育赛事、消费趋势、政策变化）。排除政府/外交/政治新闻、新华网等官媒常规报道、纯娱乐八卦。"

def call_ds(items, section, extra=''):
    key = get_ds_key()
    if not key: return None
    lines = []
    for i, it in enumerate(items, 1):
        lines.append("[%d] 标题：%s" % (i, it.get('title','')))
        lines.append("    品牌：%s" % it.get('brand',''))
    prompt = PROMPT.format(count=len(items), section=section, extra_rules=extra, item_text='\n'.join(lines))
    payload = json.dumps({"model":"deepseek-chat","messages":[{"role":"user","content":prompt}],"temperature":0.3,"max_tokens":3000}).encode()
    req = urllib.request.Request(DEEPSEEK_URL, data=payload, headers={'Authorization':'Bearer '+key,'Content-Type':'application/json'})
    try:
        resp = urllib.request.urlopen(req, timeout=90)
        reply = json.loads(resp.read().decode('utf-8'))['choices'][0]['message']['content'].strip()
        js = reply.find('['); je = reply.rfind(']')+1
        if js>=0 and je>js: return json.loads(reply[js:je])
        print("  ⚠️ 解析失败"); return None
    except Exception as e:
        print("  ❌ %s" % e); return None

def has_model(it):
    m = (it.get('model') or '').strip()
    if m: return True
    t = it.get('title','')
    for p in [r'[A-Z][0-9]',r'[0-9]+款',r'猎手K[0-9]+',r'钛7|泰山X8|豪越L|星途|凡尔赛|银河|i-HEV|EV5|i20|NV200|M817|H10|GX7|L03|i3|NX8|Avante|GT7']:
        if re.search(p, t): return True
    return False

with open(INPUT, 'r', encoding='utf-8') as f:
    data = json.load(f)

output = []
for name in ['brand_hotspots','vehicle_hotspots','social_hotspots','hyundai_buzz_topics_domestic','hyundai_buzz_topics_international']:
    items = copy.deepcopy([it for sec in data if sec.get('name')==name for it in sec.get('list',[])])
    if not items:
        output.append({"name":name,"opinion":"","list":[]})
        continue
    print("\n【%s】%d条" % (name, len(items)))
    
    if name == 'brand_hotspots':
        top = items[:15]
        results = call_ds(top, name, BRAND_EXTRA)
        if results:
            for idx, it in enumerate(top):
                r = results[idx] if idx<len(results) else None
                if not r: continue
                o = r.get('scores',{}).get('overall_tag_value_score',50)
                it['yesorno'] = 'yes' if o>=45 else ('backup' if o>=25 else '')
                it['protocol_scores'] = r.get('scores',{})
                it['selection_reason'] = r.get('selection_reason','')
                it['event_type'] = r.get('event_type','')
                it['business_tags'] = r.get('business_tags',[])
    
    elif name == 'vehicle_hotspots':
        with_m = [it for it in items if has_model(it)]
        for it in items: it['yesorno'] = ''
        top = with_m[:15]
        # Use simplified prompt for vehicle (7-dim format confuses DeepSeek)
        lines = []
        for i, it in enumerate(top, 1):
            lines.append("[%d] 标题：%s" % (i, it.get('title','')))
        v_prompt = VEHICLE_PROMPT.format(count=len(top), extra_rules="优先选热门新车上市/预售/价格信息及营销模式创新内容，排除观点文和软文。注意H10、F700、ID.7等均为有效车型名。", item_text='\n'.join(lines))
        key = get_ds_key()
        v_payload = json.dumps({"model":"deepseek-chat","messages":[{"role":"user","content":v_prompt}],"temperature":0.3,"max_tokens":2000}).encode()
        v_req = urllib.request.Request(DEEPSEEK_URL, data=v_payload, headers={'Authorization':'Bearer '+key,'Content-Type':'application/json'})
        try:
            v_resp = urllib.request.urlopen(v_req, timeout=90)
            v_reply = json.loads(v_resp.read().decode('utf-8'))['choices'][0]['message']['content'].strip()
            v_js = v_reply.find('['); v_je = v_reply.rfind(']')+1
            results = json.loads(v_reply[v_js:v_je]) if v_js>=0 and v_je>v_js else None
        except:
            results = None
        if results:
            for idx, it in enumerate(top):
                r = results[idx] if idx<len(results) else None
                if not r: continue
                o = r.get('scores',{}).get('overall_tag_value_score',50)
                it['yesorno'] = 'yes' if o>=45 else ('backup' if o>=25 else '')
                it['protocol_scores'] = r.get('scores',{})
                it['selection_reason'] = r.get('selection_reason','')
                it['event_type'] = r.get('event_type','')
                it['business_tags'] = r.get('business_tags',[])
    
    elif name == 'social_hotspots':
        for it in items: it['yesorno'] = ''
        # 过滤掉官媒/政治类来源，优先保留热度高的社会话题
        filtered = [it for it in items if not any(d in (it.get('source_url','') or '') for d in ['news.cn', 'xinhuanet', 'gov.cn', 'people.com.cn', 'cctv.com', 'chinanews', 'china.com'])]
        top30 = filtered[:30] if len(filtered) >= 15 else items[:30]
        results = []
        for s in range(0,30,15):
            r = call_ds(top30[s:s+15], name, SOCIAL_EXTRA)
            if r: results.extend(r)
        if results:
            scored = []
            for idx, it in enumerate(top30):
                r = results[idx] if idx<len(results) else None
                if not r: continue
                o = r.get('scores',{}).get('overall_tag_value_score',50)
                if o>=45: it['yesorno']='yes'
                elif o>=25: it['yesorno']='backup'
                scored.append((o,it))
            scored.sort(key=lambda x:x[0],reverse=True)
            for i,(_,it) in enumerate(scored):
                it['yesorno'] = 'yes' if i<10 else ''
    
    yn = sum(1 for it in items if it.get('yesorno')=='yes')
    bn = sum(1 for it in items if it.get('yesorno')=='backup')
    print("  yes=%d backup=%d" % (yn, bn))
    output.append({"name":name,"opinion":"","list":items})

with open(OUTPUT,'w',encoding='utf-8') as f:
    json.dump(output,f,ensure_ascii=False,indent=2)
print("\n✅ 已保存 %s" % OUTPUT)
