"""按用户最新反馈，更新评分规则后重跑车型和社会热点评分
新规则：
1. 减少推广语气/广告文的权重（"出众""给力""真强者"等PR腔）
2. 减少疑问句标题的权重（"做对了什么""为什么"等观点文）
"""

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

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

PROMO_KEYWORDS = ['出众', '给力', '真强者', '天花板', '标杆', '王者', '惊艳', '超值', '无敌', '最强', '绝了', '封神', 'YYDS', 'yyds']
QUESTION_PATTERNS = ['什么', '为什么', '如何', '怎么', '吗？', '吗?', '是否', '怎样', '哪个', '几时', '多久']


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


def build_vehicle_prompt(items):
    lines = []
    for i, it in enumerate(items, 1):
        lines.append("[%d] 标题：%s" % (i, it.get('title', '')))
        lines.append("    摘要：%s" % it.get('summary', ''))
    items_text = "\n".join(lines)
    
    return """你是现代汽车营销情报分析师。请严格按以下规则对%d条车型热点评分。

## 新增规则（优先级高）
1. ❌ 综合分析文章意图——判断是客观新闻报道还是主观推广PR/软文。考虑整体语气、立场、信息来源，而非止于标题关键词。客观报道（即便含正面描述）可保留，明确PR/软文/通稿倾向的降档。
2. ❌ 减少疑问句/设问标题文章的权重："做对了什么""为什么""如何""怎么""吗？"等提问方式的标题，多为观点文而非事实新闻，自动降档。

## 核心规则
1. 必须是具体车型相关的消息（上市/预售/降价/技术突破等）
2. 排除：纯行业分析、无具体车型的综述、软文广告

## 评分映射
- ≥ 65: strong_select → yes
- 45-64: select → yes  
- 25-44: backup
- < 25: reject

## 输出格式（严格JSON数组）
[
  {{
    "idx": 1,
    "selection_suggestion": "select",
    "selection_reason": "15字内理由",
    "marketing_opportunity": "20字内启示",
    "scores": {{
      "hyundai_relevance_score": 0-100,
      "conversion_value_score": 0-100,
      "marketing_actionability_score": 0-100,
      "brand_influence_score": 0-100,
      "customer_loyalty_score": 0-100,
      "competitor_threat_score": 0-100,
      "overall_tag_value_score": 0-100
    }},
    "event_type": "",
    "industry_tags": [],
    "business_tags": [],
    "risk_tags": ["无明显风险"]
  }},
  ...
]

待评数据：
%s""" % (len(items), items_text)


def build_social_prompt(items):
    lines = []
    for i, it in enumerate(items, 1):
        lines.append("[%d] 标题：%s" % (i, it.get('title', '')))
        lines.append("    摘要：%s" % it.get('summary', ''))
    items_text = "\n".join(lines)
    
    return """你是现代汽车营销情报分析师。请严格按以下规则对%d条社会热点评分。

## 新增规则（优先级高）
1. ❌ 减少推广语气文章权重：标题含"出众""给力""真强者""标杆""天花板"等PR腔的，视为软文/广告，自动降档
2. ❌ 减少疑问句标题权重：标题以"什么""为什么""如何""怎么"等提问方式开头的，视为观点文，自动降档

## 评分标准
- 90-100：与汽车消费/出行/消费趋势高度相关的全网热点
- 70-89：有影响力的社会话题，可借势营销
- 50-69：普通社会新闻，有一定参考价值
- 0-49：低价值或与汽车/消费场景无关

## 评分映射
- ≥ 65: strong_select
- 45-64: select
- 25-44: backup
- < 25: reject

## 输出格式（严格JSON数组）
[
  {{
    "idx": 1,
    "selection_suggestion": "select",
    "selection_reason": "15字内理由",
    "marketing_opportunity": "20字内启示",
    "scores": {{"overall_tag_value_score": 0-100}},
    "event_type": "",
    "business_tags": [],
    "risk_tags": ["无明显风险"]
  }},
  ...
]

待评数据：
%s""" % (len(items), items_text)


def call_deepseek(prompt):
    key = get_deepseek_key()
    if not key:
        return None
    payload = json.dumps({
        "model": "deepseek-chat",
        "messages": [{"role": "user", "content": prompt}],
        "temperature": 0.3,
        "max_tokens": 4000
    }).encode()
    req = urllib.request.Request(
        DEEPSEEK_API_URL, data=payload,
        headers={'Authorization': 'Bearer ' + key, 'Content-Type': 'application/json'}
    )
    try:
        resp = urllib.request.urlopen(req, timeout=90)
        result = json.loads(resp.read().decode('utf-8'))
        reply = result['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])
        print("  ⚠️ 解析失败: %s" % reply[:150])
        return None
    except Exception as e:
        print("  ❌ DeepSeek失败: %s" % e)
        return None


def has_vehicle_model(item):
    model = item.get('model', '') or ''
    if model.strip():
        return True
    title = item.get('title', '')
    patterns = [
        r'[A-Z][0-9]', r'[A-Za-z]+\s*EV', r'[0-9]+款\s*[^\s]+',
        r'猎手K[0-9]+',
        r'钛7|泰山X8|豪越L|星途ES|凡尔赛C5|星光L|悦意08|欧拉7|MR2',
        r'蒙迪欧运动版|悍野版|冠军纪念版|闪充版',
    ]
    for p in patterns:
        if re.search(p, title):
            return True
    return False


def score_section(section_name, items_to_score):
    """对一批items进行完整的协议评分"""
    print("\n▶ DeepSeek 评分（%d条）..." % len(items_to_score))
    for i, it in enumerate(items_to_score, 1):
        print("  [%d] %s" % (i, it.get('title','')[:50]))
    
    if section_name == 'vehicle_hotspots':
        prompt = build_vehicle_prompt(items_to_score)
    else:
        prompt = build_social_prompt(items_to_score)
    
    results = call_deepseek(prompt)
    if not results or len(results) != len(items_to_score):
        print("  ⚠️ DeepSeek返回异常，跳过")
        return None
    
    print("  ✅ 返回成功")
    return results


def main():
    path = '/data/news/json/origin_data/0615data.json'
    with open(path, 'r', encoding='utf-8') as f:
        data = json.load(f)
    
    for section in data:
        name = section.get('name', '')
        
        if name == 'vehicle_hotspots':
            items = section.get('list', [])
            # 收集有车型的条目
            model_items = [it for it in items if has_vehicle_model(it)]
            # Stage 1 暂用简单排序（保持和之前一致）
            # 由于之前已经做过Stage 1筛选，这里直接取有车型的前15条
            top_items = model_items[:15]
            
            # 先把不在top15里的设为空
            top_ids = {id(it) for it in top_items}
            for it in items:
                if id(it) not in top_ids:
                    it['yesorno'] = ''
                    for f in ['protocol_scores', 'selection_suggestion', 'selection_reason', 'marketing_opportunity']:
                        it.pop(f, None)
            
            results = score_section(name, top_items)
            if not results:
                continue
            
            updates = {'yes': 0, 'backup': 0, 'empty': 0}
            for idx, it in enumerate(top_items):
                r = results[idx] if idx < len(results) else None
                if not r:
                    continue
                scores = r.get('scores', {})
                overall = scores.get('overall_tag_value_score', 50)
                
                if overall >= 45:
                    it['yesorno'] = 'yes'
                    updates['yes'] += 1
                elif overall >= 25:
                    it['yesorno'] = 'backup'
                    updates['backup'] += 1
                else:
                    it['yesorno'] = ''
                    updates['empty'] += 1
                
                it['protocol_scores'] = scores
                it['selection_suggestion'] = r.get('selection_suggestion', '')
                it['selection_reason'] = r.get('selection_reason', '')
                it['marketing_opportunity'] = r.get('marketing_opportunity', '')
                it['event_type'] = r.get('event_type', '')
                it['business_tags'] = r.get('business_tags', [])
                it['risk_tags'] = r.get('risk_tags', [])
            
            print("\n▶ 结果：yes=%d backup=%d empty=%d" % (updates['yes'], updates['backup'], updates['empty']))
        
        elif name == 'social_hotspots':
            items = section.get('list', [])
            # 之前Stage1已经取过top30，直接对这30条重新评分
            # 找出含有protocol_scores的（说明是之前top30里的）
            scored_items = [it for it in items if 'protocol_scores' in it]
            
            print("\n社会热点当前有协议评分的条目: %d条" % len(scored_items))
            
            if len(scored_items) != 30:
                # 如果数量不对，用Stage1重新筛
                print("  数量不符，按标题关键词重筛30条...")
                # 简单关键词打分
                scored = []
                for it in items:
                    text = it.get('title', '') + ' ' + it.get('summary', '')
                    score = 0
                    auto_kws = ['汽车', '车', '出行', '消费', '世界杯', '赛事', '足球', '油价', '新能源', '交通', '自驾', '旅游', '经济', '就业', '收入', '物价', '降价', '补贴', '政策']
                    for kw in auto_kws:
                        if kw in text:
                            score += 10
                    scored.append((score, it))
                scored.sort(key=lambda x: x[0], reverse=True)
                scored_items = [it for _, it in scored[:30]]
            
            results = score_section(name, scored_items)
            if not results:
                continue
            
            # 重置所有social的yesorno
            for it in items:
                it['yesorno'] = ''
                for f in ['protocol_scores', 'selection_suggestion', 'selection_reason', 'marketing_opportunity']:
                    it.pop(f, None)
            
            updates = {'yes': 0, 'backup': 0, 'empty': 0}
            for idx, it in enumerate(scored_items):
                r = results[idx] if idx < len(results) else None
                if not r:
                    continue
                scores = r.get('scores', {})
                overall = scores.get('overall_tag_value_score', 50)
                
                if overall >= 45:
                    it['yesorno'] = 'yes'
                    updates['yes'] += 1
                elif overall >= 25:
                    it['yesorno'] = 'backup'
                    updates['backup'] += 1
                else:
                    # 保持空
                    updates['empty'] += 1
                
                it['protocol_scores'] = scores
                it['selection_suggestion'] = r.get('selection_suggestion', '')
                it['selection_reason'] = r.get('selection_reason', '')
                it['marketing_opportunity'] = r.get('marketing_opportunity', '')
                it['event_type'] = r.get('event_type', '')
                it['business_tags'] = r.get('business_tags', [])
                it['risk_tags'] = r.get('risk_tags', [])
            
            print("\n▶ 结果：yes=%d backup=%d empty=%d" % (updates['yes'], updates['backup'], updates['empty']))
    
    with open(path, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    print("\n✅ 已更新 %s" % path)


if __name__ == '__main__':
    main()
