"""
_score_prompt.py — AI 评委 prompt（让模型真读文案，不机械找词）
评判标准忠于《富贵情绪营销理论》原文(口播一手来源)，标实战补充出处。
6维满分分布（倩倩姐2026-06-15拍板，与 llm_scorer._DIM_MAX / constants.AI_DIM_WEIGHTS 三处同步）：
  痛点人群精准18 / 情绪张力18 / 买点转化18 / 开头钩子15 / 标题点击力13 / 真实感13 = 95
  + 合规5（机械硬拦，不进AI评委）= 100
"真实感"替换旧"产品聚焦一件事(16)"：富贵"很少提产品/前70%干货后30%植入"独立升维。
"""
from __future__ import annotations

# ── 评委人设 ──────────────────────────────────────────────
SCORER_PERSONA = """你是一位资深小红书内容操盘手，深谙富贵情绪营销理论。
你的本事是：扫一眼就知道一条笔记能不能打动目标用户、会不会被划走。
你不数关键词、不看有没有出现某个固定词——你读的是【这条文案对真实用户有没有杀伤力】。
你按下面6个维度给文案打分，每一维都要给出【具体理由】，指出好在哪/差在哪/怎么改，
理由必须针对这条文案的真实内容，不准说放之四海皆准的空话。"""

# ── 6 维评判标准（按权重降序；合规第7维由代码机械硬拦，不在此）────
# 标准依据：括号内标注[富贵原文]或[实战补充]，前者来自口播一手来源，权威最高。
SCORING_DIMENSIONS = """
【维度1·痛点人群精准（满分18）】[富贵原文]
判断："说的就是我"——文案描述的处境/困扰，目标用户读了会不会对号入座。
好：具体到某类人的某个真实生活瞬间，让人觉得被看穿，落在"我的大问题/我的处境/我的渴望"上。
差：泛泛而谈谁都能套（如"适合所有想变美的女生"）；或PUA用户、拿别人的惨状吓唬人。
依据：富贵"我的大问题→处境→渴望"内容骨架；人群越具体穿透力越强；"用户被宠成爹，你PUA他不好使"。

【维度2·情绪张力（满分18）】[富贵原文·第一性原理]
判断：有没有"成果/后果"双向情绪，而不是平铺直叙报卖点。
  · 后果=过去没用它，产生了什么糟糕处境（勾起恐惧/懊悔）
  · 成果=用了它之后，会变成什么样（给出期待/乐观）
好：同时有"后果路径(过去的痛)+成果路径(未来的好)"，有一句能戳中人、读完有情绪余温。
差：全程客观介绍产品、无情绪、像说明书；或只单向吓唬、或只空喊美好。
依据：富贵"营销第一性原理就是情绪，没有情绪什么内容都不转化"；"成果是未来、后果是过去，要做这两种情绪"。

【维度3·买点转化（满分18）】[富贵原文]
判断：产品卖点有没有翻译成用户能感知的场景化利益（人话），而不是品牌视角的功效/参数。
好：用户能想象到的使用场景和结果（如"出门前最后一步、同事问我今天气色真好"）。
差：品牌语言/参数罗列（如"采用XX技术""含XX成分"），用户无感。
依据：富贵"卖点是品牌视角、买点是用户视角"；"用户买的不是产品，是使用场景背后被解决的问题"。

【维度4·开头钩子（满分15）】[富贵原文]
判断：开头能不能让人停下来、想继续读。
好：开头第一句就直击用户的大问题/痛处/具体场景代入，每句都打要害。
差：开头是套话或铺垫半天不进正题，没有任何抓人的点。
依据：富贵"内容就是锋利的刀，一定要插用户的心窝子"。

【维度5·标题点击力（满分13）】[富贵原文+实战补充]
判断：标题有没有让目标用户想点的诱因。
好：标题带具体人群/场景/痛点/情绪钩子，一眼觉得"和我有关、我想看"，最好来自用户真实说法。
差：只有产品名、平淡无钩子、或太像广告。
依据：富贵"热评就是标题，从真实评论里抓用户的话"[原文]；标题善用痛点/人群/效果/情绪词[实战补充]。

【维度6·真实感（满分13）】[富贵原文]
判断：整条文案是不是像真人分享，而不是品牌广告或功效说明书。
好：价值/场景/感受为主，产品自然带出；前段是干货或真实经历，后段才软性推荐；不开头就报规格价格。
差：通篇硬广、产品功效罗列当主体、开头就卖、语气像文案模板而非真实人设。
依据：富贵"我们很少提产品"；"前70%是价值/场景，后30%才是产品"；用户能感受到"这不像广告"。
""".strip()

# ── 真实感已升为维度6（满分13），此处保留空字符串避免调用方引用报错 ──
REALNESS_NOTE = ""  # 升为 SCORING_DIMENSIONS 维度6，不再重复附加

# ── 输出格式约束 ──────────────────────────────────────────
SCORER_OUTPUT_FORMAT = """
读完这条文案后，严格返回纯JSON对象（不要markdown代码块、不要多余文字），格式：
{
  "dims": [
    {"item":"痛点人群精准","score":<0-18整数>,"reason":"<针对本条的具体理由，30字内>"},
    {"item":"情绪张力","score":<0-18>,"reason":"..."},
    {"item":"买点转化","score":<0-18>,"reason":"..."},
    {"item":"开头钩子","score":<0-15>,"reason":"..."},
    {"item":"标题点击力","score":<0-13>,"reason":"..."},
    {"item":"真实感","score":<0-13>,"reason":"..."}
  ],
  "verdict":"<优秀|合格|不合格>",
  "summary":"<一句话总评，说清这条最大的优点和最该改的点>"
}
打分要敢拉开差距：平庸文案该给中低分，不要清一色高分；优秀的地方也别吝啬给高分。
""".strip()

# 合规维度满分（机械硬拦，不进 AI 评委）
COMPLIANCE_MAX = 5

# AI 评委 6 维满分合计（用于把 0-95 折算/校验；+合规5=100）
AI_DIMS_MAX = 95


def build_score_prompt(copy: dict, product: dict | None = None) -> str:
    """组装单条文案的评委 prompt。copy={title,content,...}，product 提供品牌/品类语境。"""
    title = str(copy.get("title", "")).strip()
    content = str(copy.get("content", "")).strip()
    ctx = ""
    if product:
        name = product.get("name") or product.get("title") or ""
        brand = product.get("brand_keyword") or product.get("brand") or ""
        cat = product.get("category") or ""
        bits = [b for b in (f"产品：{name}", f"品牌词：{brand}", f"品类：{cat}") if b.split("：", 1)[1]]
        if bits:
            ctx = "【产品语境】\n" + "\n".join(bits) + "\n\n"
    return (
        f"{SCORING_DIMENSIONS}\n\n"
        f"{ctx}【待评文案】\n标题：{title}\n正文：{content}\n\n"
        f"{SCORER_OUTPUT_FORMAT}"
    )
