"""合并 origin_data/0616data.json + all_0616data.json → 去重 → 评分 → yes_0616data.json"""
import json, os, copy, re, urllib.request
from datetime import datetime, timedelta

ORIGIN = '/data/news/json/origin_data/0616data.json'
ALL = '/data/news/json/origin_data/all_0616data.json'
OUTPUT = '/data/news/json/origin_data/yes_0616data.json'
YES_DIR = '/data/news/json/yes_data/'

DEEPSEEK_URL = 'https://api.deepseek.com/v1/chat/completions'

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

# ---- 1. 合并两个文件 ----
print("=" * 60)
print("第1步：合并两个数据源")
print("=" * 60)

with open(ORIGIN, 'r', encoding='utf-8') as f:
    data1 = json.load(f)
with open(ALL, 'r', encoding='utf-8') as f:
    data2 = json.load(f)

# 建立 section_name -> items 的映射
merged = {}
for entry in data1 + data2:
    name = entry.get('name', '')
    items = entry.get('list', [])
    if name not in merged:
        merged[name] = []
    merged[name].extend(items)

print("合并后各板块数量：")
for k, v in merged.items():
    print("  %s: %d条" % (k, len(v)))

# ---- 2. 去重 ----
print("\n" + "=" * 60)
print("第2步：去重（同URL + DeepSeek品牌判重）")
print("=" * 60)

# 加载历史数据
history_items = []
yes_files = sorted([f for f in os.listdir(YES_DIR) if f.endswith('.json') and f != 'data.json'])
for fname in yes_files:
    try:
        with open(os.path.join(YES_DIR, fname), 'r', encoding='utf-8') as f:
            hdata = json.load(f)
        if isinstance(hdata, list):
            for sec in hdata:
                for it in sec.get('list', []):
                    t = (it.get('title') or '').strip()
                    if t:
                        history_items.append({
                            'title': t,
                            'summary': (it.get('summary') or '').strip(),
                            'brand': (it.get('brand') or '').strip(),
                            'source_url': (it.get('source_url') or '').strip()
                        })
        elif isinstance(hdata, dict):
            for sec_name, lst in hdata.items():
                if isinstance(lst, list):
                    for it in lst:
                        if isinstance(it, dict):
                            t = (it.get('title') or '').strip()
                            if t:
                                history_items.append({
                                    'title': t,
                                    'summary': (it.get('summary') or '').strip(),
                                    'brand': (it.get('brand') or '').strip(),
                                    'source_url': (it.get('source_url') or '').strip()
                                })
    except:
        pass

print("  历史数据: %d条" % len(history_items))

def dedup_list(items, section_name):
    """对一批items去重（历史 + 内部）"""
    # 构建历史索引
    hist_titles = {h['title'].lower().strip() for h in history_items}
    hist_urls = {h['source_url'] for h in history_items if h['source_url']}
    hist_brands = {}
    for h in history_items:
        ht = h['title'].lower().strip()
        if h['brand']:
            hist_brands[ht] = h['brand']
    hist_summaries = {h['title'].lower().strip(): h['summary'] for h in history_items if h['summary']}
    
    kept = []
    seen_urls = set()
    seen_titles = set()
    
    # 内部URL去重
    for it in items:
        url = (it.get('source_url') or '').strip()
        title = (it.get('title') or '').strip()
        brand = (it.get('brand') or '').strip()
        
        # 同URL去重（历史和内部）
        if url and (url in hist_urls or url in seen_urls):
            continue
        # 精确标题去重
        if title.lower().strip() in hist_titles or title.lower().strip() in seen_titles:
            continue
        
        kept.append(it)
        if url:
            seen_urls.add(url)
            hist_urls.add(url)
        if title:
            seen_titles.add(title.lower().strip())
    
    return kept

for name in list(merged.keys()):
    before = len(merged[name])
    merged[name] = dedup_list(merged[name], name)
    after = len(merged[name])
    if before - after > 0:
        print("  %s: %d → %d (去重 %d)" % (name, before, after, before - after))

# ---- 3. 评分 ----
print("\n" + "=" * 60)
print("第3步：DeepSeek评分")
print("=" * 60)

KEYWORDS = {
    '体育营销': ['世界杯','奥运','体育','赛事','运动员','欧冠','决赛','球迷','观赛','比赛','球场'],
    '情感营销': ['情感','共鸣','温度','故事','怀旧','情怀','温情','暖心','感动','治愈'],
    '用户运营': ['用户','私域','社群','会员','粉丝','圈层','忠诚','车主','社区','互动','打卡'],
    '线下体验': ['体验','场景','快闪','线下','门店','沉浸','试驾','到店','工厂','探访'],
    '本土化': ['本土化','本土','中国风','国潮','传统','文化','非遗','国货','中国'],
    '联名合作': ['联名','跨界','IP','联乘','合作款','限定','定制','联名款','携手'],
    'AI/数字化': ['AI','人工智能','数字化','数据','算力','算法','大模型','智能系统','芯片','半导体'],
    '内容营销': ['短剧','内容','短视频','直播','共创','UGC','短片','视频','广告','种草'],
    '营销模式创新': ['直播','带货','主播','秒杀','秒罄','售罄','新模式','破圈','种草','新零售'],
    '新车': ['上市','发布','预售','亮相','首发','开启预售','新车'],
    '电动化': ['电动','纯电','EV','续航','充电','新能源','纯电动'],
    '混动': ['混动','PHEV','增程','轻混','混动版','插混'],
    '智能化': ['智能','智驾','自动驾驶','座舱','激光雷达','乾崑','天枢'],
    '价格/权益': ['售价','万元','万起','补贴','优惠','限时','福利','降价','置换','金融','低至'],
    '消费/经济': ['消费','经济','就业','收入','物价','房价','补贴','政策'],
    '出行/交通': ['出行','交通','自驾','旅游','通勤','航空','高铁','地铁'],
    '政策/补贴': ['补贴','以旧换新','政策','下乡','新能源补贴','购置税','促消费','刺激'],
}

def stage1(text, weights, total):
    text_lower = text.lower()
    hit_w = 0.0; hit_n = 0
    for dim, keywords in KEYWORDS.items():
        w = weights.get(dim, 0)
        for kw in keywords:
            if kw.lower() in text_lower:
                hit_w += w; hit_n += 1; break
    s = min(100, (hit_w / total) * 100 + min(hit_n * 5, 20))
    now = datetime.now()
    if (now.month == 6 and now.day >= 12) or (now.month == 7 and now.day <= 20):
        for kw in ['世界杯','球迷','足球']:
            if kw.lower() in text_lower:
                s = min(100, s * 1.4); break
    return s

def call_ds(items, section_name):
    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('summary', ''))
        lines.append("    品牌：%s" % it.get('brand', ''))
    items_text = "\n".join(lines)

    guide_map = {
        'brand_hotspots': "90-100:汽车行业高度相关的品牌营销案例\n70-89:有价值的品牌营销动作\n50-69:普通品牌动态\n0-49:无关",
        'vehicle_hotspots': "90-100:重磅新车上市/预售\n70-89:重要车型动态\n50-69:普通车型信息\n0-49:无关",
        'social_hotspots': "90-100:与汽车消费/出行相关热点\n70-89:有影响力的社会话题\n50-69:普通社会新闻\n0-49:无关",
    }
    
    new_rules = ("\n\n新增规则：\n1. 综合分析文章意图，判断客观报道还是PR/软文，PR倾向降档\n"
                 "2. 疑问句/设问标题自动降档\n"
                 "3. 车型板块必须有具体车型名\n"
                 "4. 车型板块：有具体车型的营销模式创新（直播带货/跨界破圈/新零售等）权重最高")

    prompt = ("你是现代汽车营销情报分析师。请为以下%d条%s评分。\n%s%s\n\n"
              "评分映射：≥65→yes, 45-64→yes, 25-44→backup, <25→reject\n\n"
              "输出严格JSON数组：\n"
              "[{\"idx\":1,\"scores\":{\"overall_tag_value_score\":50},\"selection_reason\":\"15字内\"},...]\n\n"
              "待评数据：\n%s") % (len(items), section_name, guide_map.get(section_name,''), new_rules, items_text)

    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()
        json_start = reply.find('[')
        json_end = reply.rfind(']') + 1
        if json_start >= 0 and json_end > json_start:
            return json.loads(reply[json_start:json_end])
        return None
    except:
        return None

# 构建输出结构
output = []
section_order = ['brand_hotspots', 'vehicle_hotspots', 'social_hotspots', 
                 'hyundai_buzz_topics_domestic', 'hyundai_buzz_topics_international']

for name in section_order:
    items = merged.get(name, [])
    if not items:
        output.append({"name": name, "opinion": "", "list": []})
        continue
    
    print("\n【%s】%d条" % (name, len(items)))
    
    if name == 'brand_hotspots':
        results = call_ds(items, name)
        if results:
            for idx, it in enumerate(items):
                r = results[idx] if idx < len(results) else None
                if r:
                    overall = r.get('scores', {}).get('overall_tag_value_score', 50)
                    it['yesorno'] = 'yes' if overall >= 45 else ('backup' if overall >= 25 else '')
    
    elif name == 'vehicle_hotspots':
        # 车型检测
        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]+款\s*[^\s]+', r'猎手K[0-9]+', 
                       r'钛7|泰山X8|豪越L|星途EX6|凡尔赛C5|银河战舰|欧拉7|MR2']:
                if re.search(p, t): return True
            return False
        
        scored = [(stage1(it.get('title','')+' '+it.get('summary',''), 
                  {'营销模式创新':1.20,'新车':0.99,'电动化':0.74,'价格/权益':0.65,'用户运营':0.71,'本土化':0.59,'智能化':0.55,'混动':0.38,'线下体验':0.44,'AI/数字化':0.28,'内容营销':0.15}, 6.93),
                  has_model(it), it) for it in items]
        scored.sort(key=lambda x: (x[1], x[0]), reverse=True)
        top15 = [x[2] for x in scored if x[1]][:15]
        
        for it in items:
            it['yesorno'] = ''
        
        results = call_ds(top15, name)
        if results:
            for idx, it in enumerate(top15):
                r = results[idx] if idx < len(results) else None
                if r:
                    overall = r.get('scores', {}).get('overall_tag_value_score', 50)
                    it['yesorno'] = 'yes' if overall >= 45 else ('backup' if overall >= 25 else '')
    
    elif name == 'social_hotspots':
        weights_s = {'体育营销':0.39,'用户运营':0.10,'线下体验':0.10,'本土化':0.10,'AI/数字化':0.20,'智能化':0.10,'价格/权益':0.08,'消费/经济':0.30,'出行/交通':0.25}
        total_s = sum(weights_s.values())
        scored = [(stage1(it.get('title','')+' '+it.get('summary',''), weights_s, total_s), it) for it in items]
        scored.sort(key=lambda x: x[0], reverse=True)
        top30 = [it for _, it in scored[:30]]
        
        for it in items:
            it['yesorno'] = ''
        
        # 分批调用
        all_results = []
        for start in range(0, 30, 15):
            batch = top30[start:start+15]
            r = call_ds(batch, name)
            if r and len(r) == len(batch):
                all_results.extend(r)
        
        if all_results:
            scored_items = []
            for idx, it in enumerate(top30):
                r = all_results[idx] if idx < len(all_results) else None
                if r:
                    overall = r.get('scores', {}).get('overall_tag_value_score', 50)
                    if overall >= 45:
                        it['yesorno'] = 'yes'
                    elif overall >= 25:
                        it['yesorno'] = 'backup'
                    scored_items.append((overall, it))
            scored_items.sort(key=lambda x: x[0], reverse=True)
            for i, (_, it) in enumerate(scored_items):
                it['yesorno'] = 'yes' if i < 10 else ''
    
    # 统计
    yes_n = sum(1 for it in items if it.get('yesorno') == 'yes')
    bk_n = sum(1 for it in items if it.get('yesorno') == 'backup')
    print("  yes=%d backup=%d" % (yes_n, bk_n))
    
    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" + "=" * 60)
print("✅ 已保存 %s" % OUTPUT)
print("=" * 60)
