#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
补丁脚本：给4个生成函数加上知识库智能判断逻辑
- 先搜索知识库
- 有相关内容 → 知识库80% + AI优化20%
- 没有相关内容 → 100% AI生成
"""

import re

def patch_portal_html():
    with open('portal.html', 'r', encoding='utf-8') as f:
        content = f.read()
    
    modified = content
    patches_applied = []
    
    # ============================================================
    # 1. sendChat() - AI对话：加上知识库上下文
    # ============================================================
    # 在 sendChat() 的 prompt 构建前，插入知识库搜索逻辑
    old_sendChat_prompt = """    try {
        const response = await fetch(`${OLLAMA_URL}/api/generate`, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify({
            model: model,
            prompt: `你是一个专业的互联网广告创意助手。用户的问题：${msg}\n\n请给出专业、有深度的回答。`,
            stream: false,
            options: { temperature: 0.7 }
          })
        });"""
    
    new_sendChat_prompt = """    // 先搜索知识库，如果有相关内容则作为上下文
        let kbContext = '';
        try {
          const kbResp = await fetch(`${PORTAL_URL}/api/knowledge/search?q=${encodeURIComponent(msg)}`, {
            headers: { 'Authorization': `Bearer ${authToken}` }
          });
          const kbData = await kbResp.json();
          if (kbData.success && kbData.files && kbData.files.length > 0) {
            kbContext = '\\n\\n【知识库参考内容】\\n' + kbData.files.slice(0, 5).map(f => 
              `- ${f.filename}: ${f.metadata ? f.metadata.substring(0, 200) : '无摘要'}`
            ).join('\\n');
          }
        } catch(e) { console.error('Knowledge search error:', e); }
        
        try {
        const response = await fetch(`${OLLAMA_URL}/api/generate`, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify({
            model: model,
            prompt: `你是一个专业的互联网广告创意助手。用户的问题：${msg}${kbContext}\\n\\n请给出专业、有深度的回答。`,
            stream: false,
            options: { temperature: 0.7 }
          })
        });"""
    
    if old_sendChat_prompt in modified:
        modified = modified.replace(old_sendChat_prompt, new_sendChat_prompt, 1)
        patches_applied.append('sendChat() - 添加知识库上下文')
    else:
        print('  [跳过] sendChat() 提示词部分已修改或不存在')
    
    # ============================================================
    # 2. generateCopywriting() - 推广文案生成
    # ============================================================
    # 在函数开始处（检查登录之后）插入知识库搜索
    old_cw_start = """  const audience = document.getElementById('cw-audience').value.trim();
  const style = document.getElementById('cw-style').value;
  
  const prompt = `你是一个专业的${currentPlatform}内容创作者。"""
    
    new_cw_start = """  const audience = document.getElementById('cw-audience').value.trim();
  const style = document.getElementById('cw-style').value;
  
  // 先搜索知识库（判断是否有相关内容）
  let kbResults = [];
  let useKbRatio = false; // 是否使用知识库80%+AI20%模式
  try {
    const kbResp = await fetch(`${PORTAL_URL}/api/knowledge/search?q=${encodeURIComponent(product + ' ' + features)}`, {
      headers: { 'Authorization': `Bearer ${authToken}` }
    });
    const kbData = await kbResp.json();
    if (kbData.success && kbData.files && kbData.files.length > 0) {
      kbResults = kbData.files;
      useKbRatio = true; // 知识库有相关内容，使用80%+20%模式
    }
  } catch(e) { console.error('Knowledge search error:', e); }
  
  let prompt = '';
  if (useKbRatio) {
    // 知识库有相关内容：知识库80% + AI优化20%
    const kbSummary = kbResults.slice(0, 5).map(f => 
      `- ${f.filename}: ${f.metadata ? f.metadata.substring(0, 300) : '无摘要'}`
    ).join('\\n');
    prompt = `你是一个专业的${currentPlatform}内容创作者。请基于以下知识库内容（占主要参考），为产品创作一篇${currentPlatform}推广文案。\\n\\n【知识库参考内容】\\n${kbSummary}\\n\\n【本次产品信息】\\n产品：${product}\\n核心卖点：${features || '请根据产品名称自行提炼'}\\n目标人群：${audience || '请根据产品自行判断'}\\n文案风格：${style}\\n\\n要求：\\n1. 必须包含吸睛标题（带emoji）\\n2. 正文分3-4段，每段不超过3行\\n3. 结尾包含明确的行动号召（CTA）\\n4. 添加3-5个相关标签\\n5. 符合${currentPlatform}平台调性\\n6. 在知识库内容基础上进行创意优化（不要直接复制）\\n\\n请直接输出文案内容：`;
  } else {
    // 知识库没有相关内容：100% AI生成
    prompt = `你是一个专业的${currentPlatform}内容创作者。请为以下产品创作一篇${currentPlatform}推广文案：\\n\\n产品：${product}\\n核心卖点：${features || '请根据产品名称自行提炼'}\\n目标人群：${audience || '请根据产品自行判断'}\\n文案风格：${style}\\n\\n要求：\\n1. 必须包含吸睛标题（带emoji）\\n2. 正文分3-4段，每段不超过3行\\n3. 结尾包含明确的行动号召（CTA）\\n4. 添加3-5个相关标签\\n5. 符合${currentPlatform}平台调性\\n\\n请直接输出文案内容：`;
  }"""
    
    if old_cw_start in modified:
        modified = modified.replace(old_cw_start, new_cw_start, 1)
        patches_applied.append('generateCopywriting() - 添加知识库智能判断')
    else:
        print('  [跳过] generateCopywriting() 起始部分已修改或不存在')
    
    # 还需要修改结果展示，如果是知识库模式，显示知识库参考来源
    old_cw_result = """    const content = data.response;
    resultBox.innerHTML = content.replace(/\\n/g, '<br>');
    resultBox.innerHTML += `<button class="btn btn-outline btn-sm copy-btn" onclick="copyResult(this)">📋 复制</button>`;"""
    
    new_cw_result = """    const content = data.response;
    let resultHtml = content.replace(/\\n/g, '<br>');
    if (useKbRatio) {
      resultHtml = '<div style="background:#dbeafe;padding:10px 14px;border-radius:8px;margin-bottom:12px;font-size:13px;"><strong>📂 已参考知识库内容（${kbResults.length}条）</strong><br><span style="color:var(--text-secondary);">在知识库基础上进行AI优化，权重：知识库80% + AI优化20%</span></div>' + resultHtml;
    }
    resultBox.innerHTML = resultHtml + `<button class="btn btn-outline btn-sm copy-btn" onclick="copyResult(this)">📋 复制</button>`;"""
    
    if old_cw_result in modified:
        modified = modified.replace(old_cw_result, new_cw_result, 1)
        patches_applied.append('generateCopywriting() - 添加知识库来源标注')
    else:
        print('  [跳过] generateCopywriting() 结果展示部分已修改或不存在')
    
    # ============================================================
    # 3. generateScript() - 视频脚本生成
    # ============================================================
    old_gs_start = """  const prompt = `你是一个专业的短视频编导。请为以下需求创作一个${duration}秒的${type}视频分镜脚本："""
    
    new_gs_start = """  // 先搜索知识库（判断是否有相关内容）
  let kbResults Script = [];
  let useKbRatioScript = false;
  try {
    const kbResp = await fetch(`${PORTAL_URL}/api/knowledge/search?q=${encodeURIComponent(product + ' ' + type)}`, {
      headers: { 'Authorization': `Bearer ${authToken}` }
    });
    const kbData = await kbResp.json();
    if (kbData.success && kbData.files && kbData.files.length > 0) {
      kbResultsScript = kbData.files;
      useKbRatioScript = true;
    }
  } catch(e) { console.error('Knowledge search error:', e); }
  
  let prompt = '';
  if (useKbRatioScript) {
    // 知识库有相关内容
    const kbSummary = kbResultsScript.slice(0, 5).map(f => 
      `- ${f.filename}: ${f.metadata ? f.metadata.substring(0, 200) : '无摘要'}`
    ).join('\\n');
    prompt = `你是一个专业的短视频编导。请基于以下知识库内容（占主要参考），为以下需求创作一个${duration}秒的${type}视频分镜脚本：\\n\\n【知识库参考内容】\\n${kbSummary}\\n\\n【本次需求】\\n主题/产品：${product}\\n视频类型：${type}\\n目标时长：${duration}秒\\n${extra ? '额外要求：' + extra : ''}\\n\\n请按以下格式输出：\\n\\n## 视频标题\\n[吸引人的标题]\\n\\n## 总时长\\n${duration}秒\\n\\n## 分镜脚本\\n| 时间 | 画面描述 | 旁白/口播 | 字幕/特效 |\\n|------|---------|----------|----------|\\n| 0-3s | [钩子画面] | [钩子文案] | [字幕样式] |\\n（根据时长合理分配每个分镜的时间）\\n\\n## 拍摄建议\\n- 机位/景别建议\\n- 道具准备\\n- BGM风格建议\\n\\n要求在知识库内容基础上进行创意优化，不要直接复制。`;
  } else {
    // 知识库没有相关内容
    prompt = `你是一个专业的短视频编导。请为以下需求创作一个${duration}秒的${type}视频分镜脚本："""
    
    if old_gs_start in modified:
        # 需要把 prompt 的完整定义替换掉
        # 找到 prompt 定义的结束位置（到 ` 结束）
        # 这比较复杂，因为模板字符串可能跨多行
        # 先尝试简单替换开始部分
        print('  [部分] generateScript() 起始部分找到，但需要完整替换 prompt 定义')
        # 暂时跳过，因为如果已经修改过可能会失败
    else:
        print('  [跳过] generateScript() 起始部分已修改或不存在')
    
    # ============================================================
    # 4. generateContent() - 图文内容生成
    # ============================================================
    print('  需要修改 generateContent() 函数...')
    
    # 写入文件
    with open('portal.html', 'w', encoding='utf-8') as f:
        f.write(modified)
    
    print(f'\\n✅ 补丁完成！共应用 {len(patches_applied)} 个补丁：')
    for p in patches_applied:
        print(f'  - {p}')
    if len(patches_applied) < 4:
        print(f'\\n⚠️  有 {4 - len(patches_applied)} 个函数未修改，可能需要手动处理')
        
if __name__ == '__main__':
    patch_portal_html()
