#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Rewrite 3 functions using regex to avoid encoding issues.
"""

import re

filepath = r'D:\AI-Ad-Agent\portal\portal.html'

with open(filepath, 'r', encoding='utf-8') as f:
    content = f.read()

results = []

# ============================================================
# Function 1: handleMaterialSearch
# ============================================================
# Use regex to find the function from "async function handleMaterialSearch()" 
# to the next "// ====== 案例推荐 ======"
pattern1 = r'async function handleMaterialSearch\(\) \{.*?// ====== 案例推荐 ======'
match1 = re.search(pattern1, content, re.DOTALL)
if match1:
    new_func1 = '''async function handleMaterialSearch() {
  if (!requireLogin()) return;
  const prompt = document.getElementById('material-search-prompt').value.trim();
  if (!prompt) { showToast('请输入提示词/需求描述'); return; }

  const industry = document.getElementById('material-search-industry').value;
  const materialType = document.getElementById('material-search-type').value;
  const color = document.getElementById('material-search-color').value;
  const otherReq = document.getElementById('material-search-other').value.trim();

  document.getElementById('material-search-loading').style.display = 'block';
  document.getElementById('material-search-results-card').style.display = 'none';
  document.getElementById('material-search-materials-card').style.display = 'none';
  document.getElementById('material-search-btn').disabled = true;

  try {
    // === Step 1: Search KB (80% main content) ===
    let dbMaterials = [];
    let dbCopies = [];
    try {
      const searchParams = new URLSearchParams();
      searchParams.append('q', prompt + ' ' + industry);
      if (materialType === '图片') searchParams.append('category', 'material');
      const kbResp = await fetch(`${PORTAL_URL}/api/knowledge/search?${searchParams.toString()}`, {
        headers: { 'Authorization': `Bearer ${authToken}` }
      });
      const kbData = await kbResp.json();
      if (kbData.success && kbData.files) {
        dbMaterials = kbData.files;
        dbCopies = kbData.files.filter(f => f.metadata && f.metadata.trim());
      }
    } catch(e) { console.error('Knowledge search error:', e); }

    const copyListEl = document.getElementById('material-search-copy-list');
    copyListEl.innerHTML = '';
    const hasKB = dbCopies.length > 0;

    // === Step 2: KB content occupies 80% ===
    if (hasKB) {
      dbCopies.slice(0, 8).forEach((f, i) => {
        const div = document.createElement('div');
        div.className = 'copy-card';
        div.style.cssText = 'background:#f0f9ff;border:1px solid #bae6fd;border-radius:8px;padding:14px 16px;margin-bottom:10px;';
        const metaText = f.metadata.substring(0, 500);
        const metaSuffix = f.metadata.length > 500 ? '...' : '';
        div.innerHTML = '<div style="font-size:11px;color:#0369a1;font-weight:600;margin-bottom:4px;">\ud83d\udcc2 知识库文案 ' + (i+1) + ' \u00b7 ' + f.filename + '</div>' +
          '<div style="font-size:14px;line-height:1.6;">' + metaText + metaSuffix + '</div>' +
          '<div style="margin-top:8px;display:flex;gap:8px;">' +
          '<button style="font-size:12px;padding:4px 10px;border-radius:6px;border:1px solid var(--border);background:#fff;cursor:pointer;" onclick="navigator.clipboard.writeText(this.closest(\'.copy-card\').innerText)">\ud83d\udccb 复制</button>' +
          '<button style="font-size:12px;padding:4px 10px;border-radius:6px;border:1px solid var(--border);background:#fff;cursor:pointer;" onclick="previewKFile(' + f.id + ')">\ud83d\udc41\ufe0f 预览原文件</button>' +
          '</div>';
        copyListEl.appendChild(div);
      });
    }

    // === Step 3: AI analysis occupies 20% ===
    if (hasKB) {
      const kbSummary = dbCopies.slice(0, 5).map(f => f.metadata.substring(0, 200)).join('\\n---\\n');
      const aiPrompt = '你是资深广告素材优化师。以下是知识库中的素材文案，请基于这些内容做优化分析（不要重新生成文案，只做分析）：\\n\\n需求：' + prompt + '\\n行业：' + (industry || '不限') + '\\n\\n知识库文案内容：\\n' + kbSummary + '\\n\\n请输出：\\n1. 知识库文案亮点分析（2-3点）\\n2. 优化建议（2-3点，如何提升转化率）\\n3. 推荐使用场景\\n\\n控制在200字以内。';

      let aiSuggestion = '';
      try {
        const resp = await fetch(`${PORTAL_URL}/api/ollama/api/generate`, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify({model: DEFAULT_MODEL, prompt: aiPrompt, stream: false, think: false})
        });
        const data = await resp.json();
        aiSuggestion = data.response || data.message || '';
      } catch(e) { console.error('AI analysis error:', e); }

      if (aiSuggestion) {
        const aiDiv = document.createElement('div');
        aiDiv.className = 'copy-card';
        aiDiv.style.cssText = 'background:#fef3c7;border:1px solid #fbbf24;border-radius:8px;padding:14px 16px;margin-bottom:10px;';
        const safeText = aiSuggestion.replace(/</g,'&lt;').replace(/\\n/g,'<br>');
        aiDiv.innerHTML = '<div style="font-size:11px;color:#92400e;font-weight:600;margin-bottom:6px;">\ud83e\udd16 AI优化分析（基于知识库内容，占20%）</div>' +
          '<div style="font-size:13px;line-height:1.6;color:#78350f;">' + safeText + '</div>';
        copyListEl.appendChild(aiDiv);
      }
    } else {
      // === KB empty: 100% AI generation ===
      const copyPrompt = '你是资深广告文案策划。根据以下需求生成3条广告素材文案（每条100字以内）：\\n需求：' + prompt + '\\n行业：' + (industry || '不限') + '\\n素材类型：' + (materialType || '不限') + '\\n主色调：' + (color || '不限') + '\\n其他需求：' + (otherReq || '无') + '\\n\\n请按JSON格式返回：[{"title":"标题","body":"正文","style":"风格"}]\\n只返回JSON。';

      let copyList = [];
      try {
        const resp = await fetch(`${PORTAL_URL}/api/ollama/api/generate`, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify({model: DEFAULT_MODEL, prompt: copyPrompt, stream: false, think: false})
        });
        const data = await resp.json();
        const text = data.response || data.message || '';
        const jsonMatch = text.match(/\\[.*\\]/s);
        if (jsonMatch) copyList = JSON.parse(jsonMatch[0]);
      } catch(e) { console.error('Ollama error:', e); }

      if (!copyList || copyList.length === 0) {
        copyList = [{title: '参考方案', body: prompt, style: '基础'}];
      }

      copyList.forEach((item, i) => {
        const div = document.createElement('div');
        div.className = 'copy-card';
        div.style.cssText = 'background:#fef3c7;border:1px solid #fbbf24;border-radius:8px;padding:14px 16px;margin-bottom:10px;';
        div.innerHTML = '<div style="font-size:11px;color:#92400e;font-weight:600;margin-bottom:4px;">\ud83e\udd16 AI生成文案 ' + (i+1) + ' \u00b7 ' + (item.style || '通用') + '</div>' +
          '<div style="font-size:14px;line-height:1.6;"><strong>' + (item.title || '') + '</strong><br>' + (item.body || '') + '</div>' +
          '<div style="margin-top:8px;"><button style="font-size:12px;padding:4px 10px;border-radius:6px;border:1px solid var(--border);background:#fff;cursor:pointer;" onclick="navigator.clipboard.writeText(this.closest(\'.copy-card\').innerText)">\ud83d\udccb 复制</button></div>';
        copyListEl.appendChild(div);
      });
    }

    document.getElementById('material-search-results-card').style.display = '';

    // === Step 4: Display KB material files ===
    const grid = document.getElementById('material-search-material-grid');
    const empty = document.getElementById('material-search-material-empty');
    grid.innerHTML = '';
    if (dbMaterials.length === 0) {
      empty.style.display = '';
    } else {
      empty.style.display = 'none';
      dbMaterials.forEach(m => {
        const div = document.createElement('div');
        div.className = 'material-card';
        div.style.cssText = 'border:1px solid var(--border);border-radius:10px;overflow:hidden;padding:12px;';
        let metaHtml = m.metadata ? '<div style="font-size:12px;margin-top:6px;color:var(--text);">' + m.metadata.substring(0, 100) + '</div>' : '';
        div.innerHTML = '<div style="font-size:14px;font-weight:500;margin-bottom:4px;">' + (m.filename || '素材') + '</div>' +
          '<div style="font-size:12px;color:var(--text-secondary);">分类：' + (m.category || '未分类') + ' \u00b7 ' + (m.upload_time || '') + '</div>' +
          metaHtml +
          '<div style="margin-top:8px;display:flex;gap:6px;">' +
          '<button style="font-size:11px;padding:3px 8px;border-radius:6px;border:1px solid var(--border);background:#fff;cursor:pointer;" onclick="previewKFile(' + m.id + ')">\ud83d\udc41\ufe0f 预览</button>' +
          '<button style="font-size:11px;padding:3px 8px;border-radius:6px;border:1px solid var(--border);background:#fff;cursor:pointer;" onclick="downloadKFile(' + m.id + ')">\u2b07\ufe0f 下载</button>' +
          '</div>';
        grid.appendChild(div);
      });
    }
    document.getElementById('material-search-materials-card').style.display = '';

    saveRecord('material_search', '素材检索: ' + prompt.substring(0, 50),
      '提示词: ' + prompt + '<br>行业: ' + industry + '<br>知识库文案: ' + dbCopies.length + '条<br>知识库素材: ' + dbMaterials.length + '条<br>AI占比: ' + (hasKB ? '20%分析' : '100%生成'),
      { prompt, industry, material_type: materialType });

  } catch(e) {
    showToast('检索失败：' + e.message, 'error');
  } finally {
    document.getElementById('material-search-loading').style.display = 'none';
    document.getElementById('material-search-btn').disabled = false;
  }
}

// ====== 案例推荐 ======'''

    content = content[:match1.start()] + new_func1 + content[match1.end():]
    results.append("[OK] handleMaterialSearch replaced")
else:
    results.append("[SKIP] handleMaterialSearch not found")

# ============================================================
# Function 2: handleCaseSearch
# ============================================================
pattern2 = r'async function handleCaseSearch\(\) \{.*?// ====== 账户搭建 ======'
match2 = re.search(pattern2, content, re.DOTALL)
if match2:
    new_func2 = '''async function handleCaseSearch() {
  if (!requireLogin()) return;
  const prompt = document.getElementById('case-recommend-prompt').value.trim();
  if (!prompt) { showToast('请输入提示词/案例需求'); return; }

  const industry = document.getElementById('case-recommend-industry').value;
  const dimensions = document.getElementById('case-recommend-dimensions').value;
  const platform = document.getElementById('case-recommend-platform').value;

  document.getElementById('case-recommend-loading').style.display = 'block';
  document.getElementById('case-recommend-results-card').style.display = 'none';
  document.getElementById('case-recommend-search-btn').disabled = true;

  try {
    // === Step 1: Search KB cases (80% main content) ===
    let dbCases = [];
    try {
      const searchParams = new URLSearchParams();
      searchParams.append('q', prompt + ' ' + industry);
      searchParams.append('category', 'case');
      const kbResp = await fetch(`${PORTAL_URL}/api/knowledge/search?${searchParams.toString()}`, {
        headers: { 'Authorization': `Bearer ${authToken}` }
      });
      const kbData = await kbResp.json();
      if (kbData.success && kbData.files) {
        dbCases = kbData.files;
      }
    } catch(e) { console.error('Knowledge search error:', e); }

    const grid = document.getElementById('case-recommend-grid');
    const empty = document.getElementById('case-recommend-empty');
    grid.innerHTML = '';
    const hasKB = dbCases.length > 0;

    if (hasKB) {
      // === KB cases occupy 80% ===
      empty.style.display = 'none';
      dbCases.slice(0, 10).forEach((f, i) => {
        const div = document.createElement('div');
        div.className = 'case-card';
        div.style.cssText = 'border:1px solid #bae6fd;border-radius:10px;padding:14px;margin-bottom:10px;background:#f0f9ff;';
        let metaHtml = f.metadata ? '<div style="font-size:13px;line-height:1.6;color:var(--text);">' + f.metadata.substring(0, 400) + (f.metadata.length > 400 ? '...' : '') + '</div>' : '';
        div.innerHTML = '<div style="display:flex;justify-content:space-between;align-items:start;margin-bottom:6px;">' +
          '<div style="font-size:15px;font-weight:600;">' + (f.filename || '案例') + '</div>' +
          '<span style="font-size:10px;padding:2px 8px;border-radius:4px;background:#dbeafe;color:#2563eb;flex-shrink:0;">知识库 ' + (i+1) + '</span></div>' +
          '<div style="font-size:13px;color:var(--text-secondary);margin-bottom:8px;">分类：' + (f.category || '案例') + ' \u00b7 ' + (f.upload_time || '') + '</div>' +
          metaHtml +
          '<div style="margin-top:10px;display:flex;gap:6px;">' +
          '<button style="font-size:11px;padding:4px 10px;border-radius:6px;border:1px solid var(--border);background:#fff;cursor:pointer;" onclick="previewKFile(' + f.id + ')">\ud83d\udc41\ufe0f 预览详情</button>' +
          '<button style="font-size:11px;padding:4px 10px;border-radius:6px;border:1px solid var(--border);background:#fff;cursor:pointer;" onclick="downloadKFile(' + f.id + ')">\u2b07\ufe0f 下载</button></div>';
        grid.appendChild(div);
      });

      // === AI analysis occupies 20% ===
      const kbSummary = dbCases.slice(0, 5).map(f => f.filename + ': ' + (f.metadata ? f.metadata.substring(0, 200) : '无摘要')).join('\\n---\\n');
      const aiPrompt = '你是资深广告案例分析专家。以下是知识库中的案例，请做分析评估（不要重新生成案例）：\\n\\n用户需求：' + prompt + '\\n行业：' + (industry || '不限') + '\\n平台：' + (platform || '不限') + '\\n\\n知识库案例：\\n' + kbSummary + '\\n\\n请输出：\\n1. 案例亮点总结（2-3点）\\n2. 适用场景分析\\n3. 优化建议（如何在当前需求下应用这些案例经验）\\n\\n控制在200字以内。';

      try {
        const resp = await fetch(`${PORTAL_URL}/api/ollama/api/generate`, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify({model: DEFAULT_MODEL, prompt: aiPrompt, stream: false, think: false})
        });
        const data = await resp.json();
        const aiText = data.response || data.message || '';
        if (aiText) {
          const aiDiv = document.createElement('div');
          aiDiv.style.cssText = 'border:1px solid #fbbf24;border-radius:10px;padding:14px;margin-bottom:10px;background:#fef3c7;';
          const safeText = aiText.replace(/</g,'&lt;').replace(/\\n/g,'<br>');
          aiDiv.innerHTML = '<div style="display:flex;justify-content:space-between;align-items:start;margin-bottom:6px;">' +
            '<div style="font-size:15px;font-weight:600;color:#92400e;">\ud83e\udd16 AI案例分析（基于知识库案例，占20%）</div>' +
            '<span style="font-size:10px;padding:2px 8px;border-radius:4px;background:#fbbf24;color:#78350f;flex-shrink:0;">AI 20%</span></div>' +
            '<div style="font-size:13px;line-height:1.6;color:#78350f;">' + safeText + '</div>';
          grid.appendChild(aiDiv);
        }
      } catch(e) { console.error('AI analysis error:', e); }

    } else {
      // === KB empty: 100% AI generation ===
      const aiPrompt = '你是资深广告优化师。根据以下需求推荐3个广告案例：\\n需求：' + prompt + '\\n行业：' + (industry || '不限') + '\\n平台：' + (platform || '不限') + '\\n\\n请按JSON格式返回：[{"name":"案例名","industry":"行业","platform":"平台","metrics":{"点击率":"X%","转化率":"Y%"},"highlights":["亮点1","亮点2"]}]\\n只返回JSON。';

      let aiCases = [];
      try {
        const resp = await fetch(`${PORTAL_URL}/api/ollama/api/generate`, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify({model: DEFAULT_MODEL, prompt: aiPrompt, stream: false, think: false})
        });
        const data = await resp.json();
        const text = data.response || data.message || '';
        const jsonMatch = text.match(/\\[.*\\]/s);
        if (jsonMatch) aiCases = JSON.parse(jsonMatch[0]);
      } catch(e) { console.error('Ollama error:', e); }

      if (aiCases.length === 0) {
        empty.style.display = '';
      } else {
        empty.style.display = 'none';
        aiCases.forEach((c, i) => {
          let metricsHtml = '';
          if (c.metrics) {
            metricsHtml = Object.entries(c.metrics).map(function(kv) { return '<span style="font-size:11px;padding:3px 8px;border-radius:99px;background:#ede9fe;color:#6366f1;margin-right:4px;">' + kv[0] + ': ' + kv[1] + '</span>'; }).join('');
          }
          const div = document.createElement('div');
          div.className = 'case-card';
          div.style.cssText = 'border:1px solid var(--border);border-radius:10px;padding:14px;margin-bottom:10px;';
          let hlHtml = c.highlights ? '<div style="font-size:12px;margin-top:8px;color:var(--text);">' + c.highlights.map(function(h) { return '\u2022 ' + h; }).join('<br>') + '</div>' : '';
          div.innerHTML = '<div style="display:flex;justify-content:space-between;align-items:start;margin-bottom:6px;">' +
            '<div style="font-size:15px;font-weight:600;">' + (c.name || '案例') + '</div>' +
            '<span style="font-size:10px;padding:2px 8px;border-radius:4px;background:#ede9fe;color:#6366f1;flex-shrink:0;">AI生成</span></div>' +
            '<div style="font-size:13px;color:var(--text-secondary);margin-bottom:10px;">行业：' + (c.industry || '') + ' \u00b7 平台：' + (c.platform || '') + '</div>' +
            '<div>' + metricsHtml + '</div>' + hlHtml;
          grid.appendChild(div);
        });
      }
    }

    document.getElementById('case-recommend-results-card').style.display = '';

    saveRecord('case_recommend', '案例推荐: ' + prompt.substring(0, 50),
      '需求: ' + prompt + '<br>行业: ' + industry + '<br>知识库案例: ' + dbCases.length + '条<br>AI占比: ' + (hasKB ? '20%分析' : '100%生成'),
      { prompt, industry, platform });

  } catch(e) {
    showToast('推荐失败：' + e.message, 'error');
  } finally {
    document.getElementById('case-recommend-loading').style.display = 'none';
    document.getElementById('case-recommend-search-btn').disabled = false;
  }
}

// ====== 账户搭建 ======'''

    content = content[:match2.start()] + new_func2 + content[match2.end():]
    results.append("[OK] handleCaseSearch replaced")
else:
    results.append("[SKIP] handleCaseSearch not found")

# ============================================================
# Function 3: handleAccountSetup
# ============================================================
pattern3 = r'async function handleAccountSetup\(\) \{.*?// ====== 知识库管理 ======'
match3 = re.search(pattern3, content, re.DOTALL)
if match3:
    new_func3 = '''async function handleAccountSetup() {
  if (!requireLogin()) return;
  const prompt = document.getElementById('account-setup-prompt').value.trim();
  const industry = document.getElementById('account-setup-industry').value;
  const platform = document.getElementById('account-setup-platform').value;
  const budget = document.getElementById('account-setup-budget').value.trim();
  const ageRange = document.getElementById('account-setup-age-range').value.trim();

  if (!prompt) { showToast('请输入提示词/推广目标'); return; }
  if (!industry) { showToast('请选择行业'); return; }
  if (!platform) { showToast('请选择推广平台'); return; }

  document.getElementById('account-setup-loading').style.display = 'block';
  document.getElementById('account-setup-result-card').style.display = 'none';
  document.getElementById('account-setup-error-msg').style.display = 'none';
  document.getElementById('account-setup-generate-btn').disabled = true;

  try {
    // === Step 1: Search KB (80% main content) ===
    let dbKnowledge = [];
    try {
      const searchParams = new URLSearchParams();
      searchParams.append('q', prompt + ' ' + industry + ' ' + platform);
      const kbResp = await fetch(`${PORTAL_URL}/api/knowledge/search?${searchParams.toString()}`, {
        headers: { 'Authorization': `Bearer ${authToken}` }
      });
      const kbData = await kbResp.json();
      if (kbData.success && kbData.files) {
        dbKnowledge = kbData.files;
      }
    } catch(e) { console.error('Knowledge search error:', e); }

    const hasKB = dbKnowledge.length > 0;
    let result = null;

    if (hasKB) {
      // === KB content occupies 80%, AI optimizes 20% ===
      const kbSummary = dbKnowledge.slice(0, 5).map(f => f.filename + ': ' + (f.metadata ? f.metadata.substring(0, 300) : '无摘要')).join('\\n---\\n');
      const aiPrompt = '你是资深广告投放专家。以下是知识库中的账户搭建相关内容，请基于这些内容整理完整方案（80%使用知识库内容，20%做优化补充）：\\n\\n推广目标：' + prompt + '\\n行业：' + industry + '\\n平台：' + platform + '\\n预算：' + (budget || '待定') + '\\n人群：' + (ageRange || '待定') + '\\n\\n知识库内容：\\n' + kbSummary + '\\n\\n请基于知识库内容整理优化方案，按JSON格式返回：\\n{"flow":[{"step":1,"title":"步骤","desc":"说明"}],"copy":"推广文案150字内","materials":[{"type":"类型","desc":"描述"}],"budget":[{"item":"项目","amount":"金额","note":"说明"}],"audience":[{"tag":"标签","desc":"说明"}]}\\n只返回JSON。';

      try {
        const resp = await fetch(`${PORTAL_URL}/api/ollama/api/generate`, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify({model: DEFAULT_MODEL, prompt: aiPrompt, stream: false, think: false})
        });
        const data = await resp.json();
        const text = data.response || data.message || '';
        const jsonMatch = text.match(/\\{.*\\}/s);
        if (jsonMatch) result = JSON.parse(jsonMatch[0]);
      } catch(e) { console.error('AI error:', e); }

      if (!result) {
        result = {
          flow: dbKnowledge.slice(0, 5).map(function(f, i) { return {step: i+1, title: f.filename, desc: f.metadata ? f.metadata.substring(0, 150) : '参考知识库内容'}; }),
          copy: '基于知识库内容整理',
          materials: [{type: '知识库参考', desc: dbKnowledge.length + '条相关知识'}],
          budget: [{item: '参考知识库', amount: '详见知识库', note: '基于知识库方案'}],
          audience: [{tag: industry + '目标人群', desc: '参考知识库定义'}]
        };
      }
    } else {
      // === KB empty: 100% AI generation ===
      const aiPrompt = '你是资深广告投放专家。根据以下信息生成完整账户搭建方案：\\n推广目标：' + prompt + '\\n行业：' + industry + '\\n平台：' + platform + '\\n预算：' + (budget || '待定') + '\\n人群：' + (ageRange || '待定') + '\\n\\n请按JSON格式返回：\\n{"flow":[{"step":1,"title":"步骤","desc":"说明"}],"copy":"文案","materials":[{"type":"类型","desc":"描述"}],"budget":[{"item":"项目","amount":"金额","note":"说明"}],"audience":[{"tag":"标签","desc":"说明"}]}\\n只返回JSON。';

      try {
        const resp = await fetch(`${PORTAL_URL}/api/ollama/api/generate`, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify({model: DEFAULT_MODEL, prompt: aiPrompt, stream: false, think: false})
        });
        const data = await resp.json();
        const text = data.response || data.message || '';
        const jsonMatch = text.match(/\\{.*\\}/s);
        if (jsonMatch) result = JSON.parse(jsonMatch[0]);
      } catch(e) { console.error('AI error:', e); }

      if (!result) {
        result = {
          flow: [
            {step:1, title:'创建广告账户', desc:'在' + platform + '后台创建企业广告账户，完成资质认证'},
            {step:2, title:'设置投放目标', desc:'选择「' + industry + '」行业，设定转化目标'},
            {step:3, title:'搭建广告组', desc:'按产品/人群/创意类型分组'},
            {step:4, title:'制作素材', desc:'准备3-5套图片/视频素材'},
            {step:5, title:'设置定向', desc:'按' + (ageRange || '18-40岁') + '年龄段定向'},
            {step:6, title:'设定预算和出价', desc:'按' + (budget || '日预算500元') + '设定策略'},
            {step:7, title:'上线测试', desc:'小预算测试2-3天，保留优质素材'},
            {step:8, title:'优化放量', desc:'根据数据优化，逐步放大预算'}
          ],
          copy: prompt,
          materials: [
            {type:'视频素材', desc:'15s/30s 短视频，展示' + industry + '产品使用场景'},
            {type:'图片素材', desc:'横版/竖版图片，包含产品特写、场景图'},
            {type:'文案素材', desc:'信息流标题+详情页文案'}
          ],
          budget: [
            {item:'素材制作', amount:'25%', note:'3-5条素材'},
            {item:'广告投放', amount:'60%', note:'按' + (budget || '日预算')},
            {item:'优化测试', amount:'15%', note:'A/B测试'}
          ],
          audience: [
            {tag: (ageRange || '18-35岁'), desc:'主力消费人群'},
            {tag: industry + '兴趣人群', desc:'平台兴趣标签'},
            {tag:'相似人群', desc:'Look-alike扩量'}
          ]
        };
      }
    }

    // === Display results ===
    const flowEl = document.getElementById('account-setup-flow-steps');
    flowEl.innerHTML = '';
    (result.flow || []).forEach(function(item) {
      const div = document.createElement('div');
      div.style.cssText = 'display:flex;gap:12px;align-items:flex-start;margin-bottom:10px;';
      div.innerHTML = '<div style="width:28px;height:28px;border-radius:99px;background:#ede9fe;color:#6366f1;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:700;flex-shrink:0;">' + (item.step || '') + '</div>' +
        '<div><div style="font-size:14px;font-weight:600;">' + (item.title || '') + '</div><div style="font-size:13px;color:var(--text-secondary);line-height:1.5;">' + (item.desc || '') + '</div></div>';
      flowEl.appendChild(div);
    });

    document.getElementById('account-setup-copy-preview').textContent = result.copy || '暂无文案';

    const matEl = document.getElementById('account-setup-material-plan');
    matEl.innerHTML = '';
    (result.materials || []).forEach(function(item) {
      const div = document.createElement('div');
      div.style.cssText = 'background:#f8fafc;border:1px solid var(--border);border-radius:8px;padding:12px 14px;';
      div.innerHTML = '<div style="font-size:11px;color:var(--primary);font-weight:600;margin-bottom:4px;">' + (item.type || '') + '</div><div style="font-size:13px;color:var(--text);line-height:1.5;">' + (item.desc || '') + '</div>';
      matEl.appendChild(div);
    });

    const budEl = document.getElementById('account-setup-budget-grid');
    budEl.innerHTML = '';
    (result.budget || []).forEach(function(item) {
      const div = document.createElement('div');
      div.style.cssText = 'background:#f8fafc;border:1px solid var(--border);border-radius:8px;padding:12px 14px;';
      div.innerHTML = '<div style="font-size:11px;color:var(--text-secondary);margin-bottom:4px;">' + (item.item || '') + '</div><div style="font-size:16px;font-weight:700;color:var(--primary);">' + (item.amount || '') + '</div><div style="font-size:11px;color:var(--text-secondary);margin-top:4px;">' + (item.note || '') + '</div>';
      budEl.appendChild(div);
    });

    const audEl = document.getElementById('account-setup-audience-tags');
    audEl.innerHTML = '';
    (result.audience || []).forEach(function(item) {
      const span = document.createElement('span');
      span.style.cssText = 'padding:5px 12px;border-radius:99px;background:#fef3c7;color:#92400e;font-size:13px;font-weight:500;';
      span.textContent = (item.tag || '') + (item.desc ? '（' + item.desc + '）' : '');
      audEl.appendChild(span);
    });

    // KB source annotation
    const resultCard = document.getElementById('account-setup-result-card');
    const oldRef = resultCard.querySelector('[data-kb-ref]');
    if (oldRef) oldRef.remove();

    if (hasKB) {
      let refHtml = '<div data-kb-ref="1" style="margin-top:16px;padding:14px;background:#f0f9ff;border:1px solid #bae6fd;border-radius:8px;">';
      refHtml += '<div style="font-size:13px;color:#0369a1;font-weight:600;margin-bottom:8px;">\ud83d\udcc2 知识库来源（80%内容来自知识库，AI优化占20%）</div>';
      dbKnowledge.slice(0, 5).forEach(function(f) {
        refHtml += '<div style="font-size:12px;color:#0c4a6e;margin-top:6px;display:flex;align-items:center;gap:6px;"><span>\u2022</span><span style="flex:1;">' + f.filename + '</span><button style="font-size:11px;padding:2px 8px;border-radius:4px;border:1px solid #bae6fd;background:#fff;cursor:pointer;color:#0369a1;" onclick="previewKFile(' + f.id + ')">\ud83d\udc41\ufe0f 查看</button></div>';
      });
      refHtml += '</div>';
      resultCard.insertAdjacentHTML('beforeend', refHtml);
    } else {
      let refHtml = '<div data-kb-ref="1" style="margin-top:16px;padding:14px;background:#fef3c7;border:1px solid #fbbf24;border-radius:8px;">';
      refHtml += '<div style="font-size:13px;color:#92400e;font-weight:600;">\ud83e\udd16 本方案由AI 100%生成（知识库中未找到相关内容）</div>';
      refHtml += '</div>';
      resultCard.insertAdjacentHTML('beforeend', refHtml);
    }

    document.getElementById('account-setup-result-card').style.display = '';

    saveRecord('account_setup', '账户搭建: ' + prompt.substring(0, 50),
      '推广目标: ' + prompt + '<br>行业: ' + industry + '<br>平台: ' + platform + '<br>知识库参考: ' + dbKnowledge.length + '条<br>AI占比: ' + (hasKB ? '20%优化' : '100%生成'),
      { prompt, industry, platform, budget });

  } catch(e) {
    document.getElementById('account-setup-error-msg').textContent = '生成失败：' + e.message;
    document.getElementById('account-setup-error-msg').style.display = '';
  } finally {
    document.getElementById('account-setup-loading').style.display = 'none';
    document.getElementById('account-setup-generate-btn').disabled = false;
  }
}


// ====== 知识库管理 ======'''

    content = content[:match3.start()] + new_func3 + content[match3.end():]
    results.append("[OK] handleAccountSetup replaced")
else:
    results.append("[SKIP] handleAccountSetup not found")

# Write back
with open(filepath, 'w', encoding='utf-8') as f:
    f.write(content)

for r in results:
    print(r)
print("\nDone! All 3 functions updated.")
