"""
AI 引擎中心常量
扒自：worker/src/copy.js + image.js 上线版
业务参数不写死（基石A）——分值权重可由产品档案配置覆盖
"""

# ── 合规红线 ──────────────────────────────────────────────
# 初始默认词库（数据库 banned_words 表可覆盖，updatable=True）
BANNED_WORDS_DEFAULT = ["美白", "祛斑", "速效", "医用", "药妆"]
BANNED_VISUAL_WORDS = [
    "前后对比", "使用前后", "用前用后",
    "before", "after", "变白", "瑕疵消失", "治疗前后",
]
# 内部提示词（不能混入正文 content 字段）
INTERNAL_COPY_HINTS = [
    "配图建议", "图片方向", "内页规划", "适合做成",
    "不要做促销海报", "配图说明", "封面建议",
]

# ── 机械五维打分基线（仅轨B导入文案/降级回退用；轨A已切 AI 评委 llm_score_copy）─────
# 历史注：轨A原用此5维，2026-06-15切至7维AI评委(6维+合规)后此处只作轨B+回退占位。
# 关键词维度(keyword20)因 products 表无 keywords 字段导致 matched 恒空已知不准；
# 轨A不再依赖此权重，轨B展示参考可接受。不按此调分，真过关靠北哥抽检。
SCORE_WEIGHTS = {
    "title": 25,
    "emotion": 25,
    "selling": 25,
    "keyword": 20,
    "compliance": 5,
}
# ── AI 评委 7 维满分分布（倩倩姐2026-06-15拍板·与 llm_scorer._DIM_MAX/_score_prompt 三处同步）──
# 6维AI读分(痛点18+情绪18+买点18+钩子15+标题13+真实感13=95) + 合规5 = 100
# "真实感"=富贵"很少提产品/前70%干货后30%植入"原则，替换旧机械维度"产品聚焦一件事(16)"
AI_DIM_WEIGHTS = {
    "痛点人群精准": 18,
    "情绪张力":     18,
    "买点转化":     18,
    "开头钩子":     15,
    "标题点击力":   13,
    "真实感":       13,
    "compliance":    5,  # 机械硬拦，不进 AI 评委
}
# 过线分。倩倩姐2026-06-15拍板：80是临时观察值(AI评委给分克制，84文案实为合格)。
# 倩倩姐2026-06-15再次拍板：维持80临时线，不准擅自调85。方向=提生成质量顶分数，不降标准。
# 真过关靠北哥抽检；提质量方向=优化生成 prompt，不靠提高门槛凑数。
QUALITY_PASS_SCORE = 80

# ── 文案去重阈值 ──────────────────────────────────────────
DEDUP_TITLE_THRESHOLD = 0.82       # 标题相似度≥此值判重
DEDUP_TITLE_CONTENT_TITLE = 0.65   # 标题+正文联合判重时的标题阈值
DEDUP_TITLE_CONTENT_BODY = 0.72    # 标题+正文联合判重时的正文阈值

# ── 自动优化循环 ──────────────────────────────────────────
MAX_OPTIMIZE_ROUNDS = 2  # 最多重生成轮次

# ── storyboard 分镜角色（枚举不写死数量）────────────────
# Q6: 北哥6张套路顺序 ①封面痛点大字 ②单品特写+品牌词 ③成分 ④质地 ⑤上脸对比 ⑥促单
PAGE_ROLES = [
    {"role": "hook",            "name": "封面痛点大字", "focus": "负责点击：强情绪大字标题压痛点，产品露出，真实生活场景，像用户主动分享，不像广告海报"},
    {"role": "product_closeup", "name": "单品特写",    "focus": "负责种草锚点：单品高清特写+品牌词自然植入，第2/6张都带品牌词，强化记忆"},
    {"role": "ingredient",      "name": "成分拆解",    "focus": "负责信任：核心成分信息、作用说明，避免医疗化和绝对化表达，信息清晰可信"},
    {"role": "texture",         "name": "质地展示",    "focus": "负责种草：质地近景、涂抹过程、肤感说明，真实手部/桌面/日常光线"},
    {"role": "applied_proof",   "name": "上脸对比",    "focus": "负责证明：可感知上脸效果，展示涂抹前后质地变化（不做肤色变白/瑕疵消失等违规暗示），第5张"},
    {"role": "closer",          "name": "促单收尾",    "focus": "负责转化：转化句+品牌词，引导搜索品牌词成交，软性收尾不硬广，第6张再带一次品牌词"},
    # 扩展角色（8张链路用）
    {"role": "pain_scene",  "name": "痛点共鸣",  "focus": "负责共鸣：展示目标人群的真实困扰和使用前情境，但不做功效前后对比"},
    {"role": "social_proof","name": "信任背书",  "focus": "负责背书：多人反馈、囤货、复购等真实社交证据"},
    {"role": "scenario",    "name": "多场景演示", "focus": "负责代入：多场景使用展示，不做夸大效果承诺"},
    {"role": "tutorial",    "name": "使用教程",  "focus": "负责降低门槛：简洁步骤、用量、注意事项"},
]
PAGE_ROLE_MAP = {r["role"]: r for r in PAGE_ROLES}

# ── 生图风格预设（扒 image.js STYLE_PROMPTS:26-29）──────────
# 按 style 参数选小红书风格调性，注入 base_prompt 的"视觉风格"行
STYLE_PROMPTS = {
    "xiaohongshu_cover": "小红书种草风，独立3:4图文海报/素材图，1024×1536构图，明亮干净，真实实拍质感，醒目中文短标题，文字在安全区内",
    "comparison": "小红书说明对比风，独立3:4图文海报/素材图，1024×1536构图，质地/场景/肤感左右或上下对比，信息层级清晰",
    "ingredient": "小红书成分科普风，独立3:4图文海报/素材图，1024×1536构图，成分卡片布局，浅色商务美妆风，避免医疗化表达",
}
STYLE_DEFAULT = "xiaohongshu_cover"

# ── 叙事链路说明（扒 image.js planImageSet narrativeText:677-681）──
# 按图数告诉模型整组图的种草节奏，让每张各司其职不雷同
NARRATIVE_BY_COUNT = {
    3: "3张极速链路：第1张负责点击，第2张是按品类变化的核心证明页，第3张负责软性转化。",
    6: "6张标准种草链路：封面点击、单品特写带品牌词、成分信任、质地种草、上脸证明、促单转化，每张画面和文字各司其职不重复。",
    8: "8张沉浸测评链路：点击、痛点共鸣、单品特写、成分、质地、上脸证明、背书、软性转化。",
}

# ── 3套正交叙事策略（倩倩姐2026-06-15起草，北哥过目版）──────────────
# A痛点先行/B场景先行/C成分背书先行，三套正交轴拉开差异
# 每套叙事链路注入 base_prompt 叙事链路段，替换 NARRATIVE_BY_COUNT 默认值
NARRATIVE_BY_STRATEGY = {
    "A": (
        '【套A·痛点先行】整组基调：紧迫感、强对比、情绪共鸣，文字短促带感叹号，直戳"脸黄显疲惫""素颜不敢出门"。'
        '6张链路：①痛点暴击封面（强情绪大字直击暗黄/素颜焦虑）→ ②暗黄脸实拍对比（感叹号+对比词制造紧迫感）'
        '→ ③单品特写+品牌词 → ④成分为什么能救暗黄（成分拆解+信任） → ⑤上脸提亮实证 → ⑥"别再顶着黄脸早八"软性促单。'
    ),
    "B": (
        '【套B·场景先行】整组基调：轻松、生活化、代入感，突出"快/省时/伪素颜自由"，点到性价比不堆砌。'
        '6张链路：①"早八来不及"场景封面（生活场景钩子） → ②手忙脚乱通勤场景（代入早八焦虑）'
        '→ ③一抹搞定单品特写+品牌词 → ④养肤成分让你敢素颜 → ⑤30秒上脸效果 → ⑥"伪素颜自由+平价"软性促单。'
    ),
    "C": (
        '【套C·成分背书先行】整组基调：专业、可信、真实测评感，强调成分逻辑+前后对比+像有用户实证背书。'
        '6张链路：①成分权威封面（核心成分信息锚定信任） → ②核心成分图解（作用说明+清晰可信）'
        '→ ③单品特写+品牌词 → ④使用前后时间线对比 → ⑤真实上脸细节 → ⑥"成分党闭眼入"软性促单。'
    ),
}

# ── 生图通道 ──────────────────────────────────────────────
IMAGE_RETRY_ATTEMPTS = 3
IMAGE_RETRY_BACKOFF_BASE = 2.0  # 指数退避底数（秒）
IMAGE_SIZE_DEFAULT = "1024x1536"

# ── 生图合规负向约束（方法层常量，全品类共用，可扩展）───────────────────────
# 追加到每个 base_prompt 末尾，防模型脑补违禁词/真实品牌到包装
IMAGE_NEGATIVE_CONSTRAINTS = (
    "【包装合规硬性禁止——必须严格遵守】"
    "①包装/瓶身/标签上禁止出现任何违禁词：美白/whitening/祛斑/brightening/"
    "医用/medical/drug/药妆/速效/instant，中英文全禁；"
    "②禁止脑补任何真实品牌名或logo（如水密码/WETCODE/兰蔻/SK-II等），"
    "产品包装只允许出现用户传入的指定品牌词，未传则画无字素瓶；"
    "③英文功效词(ANTI-AGING/TONE-UP/BRIGHTENING/FIRMING等)禁止印在包装；"
    "④如果提供了产品参考图，包装文字以参考图为准，不得自行添加或修改任何文字。"
    "⑤背景纯净：禁止出现电子设备/笔记本电脑/键盘/手机/桌面杂物等无关物体（参考图若含此类背景一律不沿用），"
    "只保留浅色简洁台面或产品定制场景，主体聚焦产品本身。"
)

# ── 飞轮信号权重（初始默认，北哥可校准）────────────────
FLYWHEEL_WEIGHTS = {
    "text_select": 3,
    "image_select": 3,
    "approve": 5,
    "reject_with_reason": -3,
    "regenerate": -1,
}
FLYWHEEL_LOOKBACK = 50    # 聚合最近N条事件
FLYWHEEL_COLD_START = 5   # 信号不足N条时用产品档案冷启动
