#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
整合素材检索、案例推荐、账户搭建为 portal.html 的内联面板
并添加历史记录功能
"""

import re

PORTAL = r"D:\AI-Ad-Agent\portal\portal.html"

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

# ====== 1. 添加3个新面板 HTML (插入在 panel-digital-human 结束之后, panel-users 之前) ======

NEW_PANELS = """

    <!-- ====== 素材检索 PANEL ====== -->
    <div class="panel" id="panel-material-search">
      <div class="card">
        <div class="card-header">🔍 素材检索 <span style="font-weight:400;font-size:12px;color:var(--danger);margin-left:8px;">🔒 需登录</span></div>
        <div class="card-body">
          <div id="matsearch-login-required" class="login-required" style="display:none;">
            <div class="lock-icon">🔒</div>
            <div class="lock-msg">请先登录后使用素材检索功能</div>
            <p style="font-size:13px;color:var(--text-secondary);">在左侧输入用户名和密码登录</p>
          </div>
          <div id="matsearch-content">
          <div class="form-grid">
            <div class="form-group full">
              <label>提示词 / 需求描述 *</label>
              <textarea id="mat-prompt" rows="3" placeholder="请描述您需要什么样的素材，例如：推广一款面向年轻人的运动饮料，要活力、时尚风格"></textarea>
            </div>
            <div class="form-group">
              <label>行业</label>
              <select id="mat-industry">
                <option value="">不限</option>
                <option value="饮料">饮料</option>
                <option value="美妆">美妆</option>
                <option value="服饰">服饰</option>
                <option value="食品">食品</option>
                <option value="数码">数码</option>
                <option value="教育">教育</option>
                <option value="金融">金融</option>
                <option value="房产">房产</option>
                <option value="汽车">汽车</option>
                <option value="其他">其他</option>
              </select>
            </div>
            <div class="form-group">
              <label>素材类型</label>
              <select id="mat-type">
                <option value="">不限</option>
                <option value="图片">图片</option>
                <option value="视频">视频</option>
              </select>
            </div>
            <div class="form-group">
              <label>主色调</label>
              <select id="mat-color">
                <option value="">不限</option>
                <option value="红色">红色</option>
                <option value="蓝色">蓝色</option>
                <option value="绿色">绿色</option>
                <option value="黄色">黄色</option>
                <option value="黑色">黑色</option>
                <option value="白色">白色</option>
                <option value="多彩">多彩</option>
              </select>
            </div>
            <div class="form-group">
              <label>其他需求</label>
              <input type="text" id="mat-other" placeholder="例如：要有产品特写、年轻人群体、户外场景">
            </div>
            <div class="form-group full" style="text-align:right;">
              <button class="btn btn-primary" id="mat-search-btn" onclick="handleMaterialSearch()">🚀 开始检索并生成</button>
            </div>
          </div>

          <div class="loading" id="mat-loading" style="display:none;">⏳ 正在检索知识库并调用 AI 生成文案，请稍候...</div>

          <div class="card" id="mat-results-card" style="display:none;margin-top:16px;">
            <div class="card-header">📝 生成素材文案（AI 生成）</div>
            <div class="card-body">
              <div class="copy-list" id="mat-copy-list"></div>
            </div>
          </div>

          <div class="card" id="mat-materials-card" style="display:none;margin-top:16px;">
            <div class="card-header">🎯 推荐素材（来自知识库）</div>
            <div class="card-body">
              <div class="material-grid" id="mat-material-grid"></div>
              <div class="empty" id="mat-material-empty" style="display:none;">知识库中暂无匹配素材，请先到「知识库管理」上传。</div>
            </div>
          </div>

          </div><!-- /matsearch-content -->
        </div>
      </div>
      <!-- 素材检索历史 -->
      <div class="record-list" id="material-search-record-list" style="display:none;"></div>
    </div>

    <!-- ====== 案例推荐 PANEL ====== -->
    <div class="panel" id="panel-case-recommend">
      <div class="card">
        <div class="card-header">📊 案例推荐 <span style="font-weight:400;font-size:12px;color:var(--danger);margin-left:8px;">🔒 需登录</span></div>
        <div class="card-body">
          <div id="case-login-required" class="login-required" style="display:none;">
            <div class="lock-icon">🔒</div>
            <div class="lock-msg">请先登录后使用案例推荐功能</div>
            <p style="font-size:13px;color:var(--text-secondary);">在左侧输入用户名和密码登录</p>
          </div>
          <div id="case-content">
          <div class="form-grid">
            <div class="form-group full">
              <label>提示词 / 案例需求 *</label>
              <textarea id="case-prompt" rows="3" placeholder="请描述您想找什么类型的案例，例如：找运动饮料在抖音的信息流广告案例，重点看点击率和转化率"></textarea>
            </div>
            <div class="form-group">
              <label>行业</label>
              <select id="case-industry">
                <option value="">不限</option>
                <option value="饮料">饮料</option>
                <option value="美妆">美妆</option>
                <option value="服饰">服饰</option>
                <option value="食品">食品</option>
                <option value="数码">数码</option>
                <option value="教育">教育</option>
                <option value="金融">金融</option>
                <option value="房产">房产</option>
                <option value="汽车">汽车</option>
                <option value="其他">其他</option>
              </select>
            </div>
            <div class="form-group">
              <label>需要的数据维度</label>
              <select id="case-dimensions">
                <option value="">不限</option>
                <option value="点击率">点击率</option>
                <option value="转化率">转化率</option>
                <option value="曝光量">曝光量</option>
                <option value="互动率">互动率</option>
                <option value="ROI">ROI</option>
                <option value="全部">全部维度</option>
              </select>
            </div>
            <div class="form-group">
              <label>平台/渠道</label>
              <select id="case-platform">
                <option value="">不限</option>
                <option value="抖音">抖音</option>
                <option value="快手">快手</option>
                <option value="微信">微信</option>
                <option value="小红书">小红书</option>
                <option value="B站">B站</option>
                <option value="信息流">信息流</option>
                <option value="搜索广告">搜索广告</option>
              </select>
            </div>
            <div class="form-group full" style="text-align:right;">
              <button class="btn btn-primary" id="case-search-btn" onclick="handleCaseSearch()">🔍 开始推荐案例</button>
            </div>
          </div>

          <div class="loading" id="case-loading" style="display:none;">⏳ 正在从知识库检索相关案例，请稍候...</div>

          <div class="card" id="case-results-card" style="display:none;margin-top:16px;">
            <div class="card-header">📊 推荐案例</div>
            <div class="card-body">
              <div class="case-grid" id="case-grid"></div>
              <div class="empty" id="case-empty" style="display:none;">知识库中暂无相关案例，请先到「知识库管理」上传案例文件。</div>
            </div>
          </div>

          </div><!-- /case-content -->
        </div>
      </div>
      <!-- 案例推荐历史 -->
      <div class="record-list" id="case-recommend-record-list" style="display:none;"></div>
    </div>

    <!-- ====== 账户搭建 PANEL ====== -->
    <div class="panel" id="panel-account-setup">
      <div class="card">
        <div class="card-header">🏗️ 账户搭建 <span style="font-weight:400;font-size:12px;color:var(--danger);margin-left:8px;">🔒 需登录</span></div>
        <div class="card-body">
          <div id="acct-login-required" class="login-required" style="display:none;">
            <div class="lock-icon">🔒</div>
            <div class="lock-msg">请先登录后使用账户搭建功能</div>
            <p style="font-size:13px;color:var(--text-secondary);">在左侧输入用户名和密码登录</p>
          </div>
          <div id="acct-content">
          <div class="form-grid">
            <div class="form-group full">
              <label>提示词 / 推广目标 *</label>
              <textarea id="acct-prompt" rows="3" placeholder="请描述您的推广目标和需求，例如：为某运动饮料品牌在抖音搭建信息流广告账户，目标人群18-35岁，主打活力、时尚，推广新品「X能量饮」，预算5万元"></textarea>
            </div>
            <div class="form-group">
              <label>行业 *</label>
              <select id="acct-industry">
                <option value="">请选择</option>
                <option value="饮料">饮料</option>
                <option value="美妆">美妆</option>
                <option value="服饰">服饰</option>
                <option value="食品">食品</option>
                <option value="数码">数码</option>
                <option value="教育">教育</option>
                <option value="金融">金融</option>
                <option value="房产">房产</option>
                <option value="汽车">汽车</option>
                <option value="其他">其他</option>
              </select>
            </div>
            <div class="form-group">
              <label>推广平台 *</label>
              <select id="acct-platform">
                <option value="">请选择</option>
                <option value="抖音">抖音</option>
                <option value="快手">快手</option>
                <option value="微信">微信</option>
                <option value="小红书">小红书</option>
                <option value="B站">B站</option>
                <option value="百度">百度</option>
                <option value="腾讯广告">腾讯广告</option>
                <option value="巨量引擎">巨量引擎</option>
              </select>
            </div>
            <div class="form-group">
              <label>投放预算</label>
              <input type="text" id="acct-budget" placeholder="例如：5万元/月">
            </div>
            <div class="form-group">
              <label>目标人群年龄段</label>
              <input type="text" id="acct-age-range" placeholder="例如：18-35岁 或 25-40岁">
            </div>
            <div class="form-group full" style="text-align:right;">
              <button class="btn btn-primary" id="acct-generate-btn" onclick="handleAccountSetup()">🏗️ 生成账户搭建方案</button>
            </div>
          </div>

          <div class="loading" id="acct-loading" style="display:none;">⏳ 正在调用 AI 生成账户搭建方案，请稍候...</div>
          <div class="error-msg" id="acct-error-msg" style="display:none;"></div>

          <div class="card" id="acct-result-card" style="display:none;margin-top:16px;">
            <div class="card-header">📊 账户搭建方案</div>
            <div class="card-body">
              <!-- 搭建流程 -->
              <div class="result-section" style="padding:16px 0;border-bottom:1px solid var(--border);">
                <div class="section-title" style="font-size:15px;font-weight:600;margin-bottom:12px;">🔧 搭建流程</div>
                <div class="flow-steps" id="acct-flow-steps"></div>
              </div>
              <!-- 推广文案 -->
              <div class="result-section" style="padding:16px 0;border-bottom:1px solid var(--border);">
                <div class="section-title" style="font-size:15px;font-weight:600;margin-bottom:12px;">✍️ 推荐推广文案</div>
                <div class="copy-preview" id="acct-copy-preview" style="background:#f8fafc;border:1px solid var(--border);border-radius:8px;padding:14px 16px;font-size:14px;line-height:1.6;white-space:pre-wrap;"></div>
              </div>
              <!-- 素材规划 -->
              <div class="result-section" style="padding:16px 0;border-bottom:1px solid var(--border);">
                <div class="section-title" style="font-size:15px;font-weight:600;margin-bottom:12px;">🎨 素材规划</div>
                <div class="material-plan" id="acct-material-plan" style="display:grid;grid-template-columns:repeat(auto-fill, minmax(220px, 1fr));gap:12px;"></div>
              </div>
              <!-- 投放预算分配 -->
              <div class="result-section" style="padding:16px 0;border-bottom:1px solid var(--border);">
                <div class="section-title" style="font-size:15px;font-weight:600;margin-bottom:12px;">💰 投放预算分配</div>
                <div class="budget-grid" id="acct-budget-grid" style="display:grid;grid-template-columns:repeat(auto-fill, minmax(180px, 1fr));gap:12px;"></div>
              </div>
              <!-- 目标人群 -->
              <div class="result-section" style="padding:16px 0;">
                <div class="section-title" style="font-size:15px;font-weight:600;margin-bottom:12px;">👥 目标人群</div>
                <div class="audience-tags" id="acct-audience-tags" style="display:flex;gap:8px;flex-wrap:wrap;"></div>
              </div>
            </div>
          </div>

          </div><!-- /acct-content -->
        </div>
      </div>
      <!-- 账户搭建历史 -->
      <div class="record-list" id="account-setup-record-list" style="display:none;"></div>
    </div>
"""

# 插入点：在 panel-digital-human 的结束标签之后，panel-users 之前
# panel-digital-human 结束于 </div> (line 1315 附近)
insert_marker = '</div>\n    \n    <!-- ====== USER MANAGEMENT PANEL'
insert_pos = content.find(insert_marker)
if insert_pos == -1:
    # 尝试另一种匹配方式
    insert_pos = content.find('<!-- ====== USER MANAGEMENT PANEL')
    if insert_pos == -1:
        print("ERROR: 找不到插入点！")
        exit(1)

# 在插入点之前插入新面板
content = content[:insert_pos] + NEW_PANELS + '\n' + content[insert_pos:]

print(f"✅ 已插入3个新面板 HTML (插入位置: {insert_pos})")

# ====== 2. 更新 PANEL_TYPE_MAP ======
old_type_map = """const PANEL_TYPE_MAP = {
  'chat': 'chat',
  'knowledge': 'knowledge',
  'copywriting': 'copywriting',
  'script': 'script',
  'image': 'image',
  'voice': 'voice',
  'content': 'content',
};"""
new_type_map = """const PANEL_TYPE_MAP = {
  'chat': 'chat',
  'knowledge': 'knowledge',
  'copywriting': 'copywriting',
  'script': 'script',
  'image': 'image',
  'voice': 'voice',
  'content': 'content',
  'material_search': 'material_search',
  'case_recommend': 'case_recommend',
  'account_setup': 'account_setup',
};"""
content = content.replace(old_type_map, new_type_map)
print("✅ 已更新 PANEL_TYPE_MAP")

# ====== 3. 更新 TYPE_NAMES ======
old_type_names = """const TYPE_NAMES = {
  'chat': '对话',
  'knowledge': '知识库检索',
  'copywriting': '推广文案',
  'script': '视频脚本',
  'image': '图像创作',
  'voice': '语音合成',
  'content': '图文内容',
};"""
new_type_names = """const TYPE_NAMES = {
  'chat': '对话',
  'knowledge': '知识库检索',
  'copywriting': '推广文案',
  'script': '视频脚本',
  'image': '图像创作',
  'voice': '语音合成',
  'content': '图文内容',
  'material_search': '素材检索',
  'case_recommend': '案例推荐',
  'account_setup': '账户搭建',
};"""
content = content.replace(old_type_names, new_type_names)
print("✅ 已更新 TYPE_NAMES")

# ====== 4. 更新 switchPanel 函数 ======
# 4.1 更新 lockedPanels
old_locked = "const lockedPanels = ['knowledge', 'copywriting', 'script', 'image', 'voice', 'content', 'digital-human'];"
new_locked = "const lockedPanels = ['knowledge', 'copywriting', 'script', 'image', 'voice', 'content', 'digital-human', 'material_search', 'case_recommend', 'account_setup'];"
content = content.replace(old_locked, new_locked)
print("✅ 已更新 switchPanel lockedPanels")

# 4.2 更新 titles 对象
old_titles = """    const titles = {
      home:'🏠 工作台首页', chat:'💬 AI 对话助手', knowledge:'📚 知识库检索',
      copywriting:'✍️ 推广文案生成', script:'🎬 视频脚本生成',
      image:'🎨 智能图像创作', voice:'🔊 语音合成', content:'📄 图文内容生成',
      'digital-human':'🎤 数字人口播', users:'👥 用户管理'
    };"""
new_titles = """    const titles = {
      home:'🏠 工作台首页', chat:'💬 AI 对话助手', knowledge:'📚 知识库检索',
      copywriting:'✍️ 推广文案生成', script:'🎬 视频脚本生成',
      image:'🎨 智能图像创作', voice:'🔊 语音合成', content:'📄 图文内容生成',
      'digital-human':'🎤 数字人口播', users:'👥 用户管理',
      'material-search':'🔍 素材检索', 'case-recommend':'📊 案例推荐', 'account-setup':'🏗️ 账户搭建'
    };"""
content = content.replace(old_titles, new_titles)
print("✅ 已更新 switchPanel titles")

# 4.3 更新 listPanels
old_list = "    const listPanels = ['chat', 'knowledge', 'copywriting', 'script', 'image', 'voice', 'content'];"
new_list = "    const listPanels = ['chat', 'knowledge', 'copywriting', 'script', 'image', 'voice', 'content', 'material_search', 'case_recommend', 'account_setup'];"
content = content.replace(old_list, new_list)
print("✅ 已更新 switchPanel listPanels")

# ====== 5. 更新侧边栏子菜单链接 ======
old_submenu = """      <a href="#knowledge" data-panel="knowledge">📚 知识库检索</a>
      <a href="material_search.html">🔍 素材检索</a>
      <a href="case_recommendation.html">📊 案例推荐</a>
      <a href="account_setup.html">🏗️ 账户搭建</a>
      <a href="knowledge.html">🗂️ 知识库管理</a>"""
new_submenu = """      <a href="#knowledge" data-panel="knowledge">📚 知识库检索</a>
      <a href="#material-search" data-panel="material-search">🔍 素材检索</a>
      <a href="#case-recommend" data-panel="case-recommend">📊 案例推荐</a>
      <a href="#account-setup" data-panel="account-setup">🏗️ 账户搭建</a>
      <a href="knowledge.html" target="_blank">🗂️ 知识库管理</a>"""
content = content.replace(old_submenu, new_submenu)
print("✅ 已更新侧边栏子菜单链接")

# ====== 6. 添加 JavaScript 函数（素材检索、案例推荐、账户搭建） ======
# 在 </script> 之前插入新函数

new_js = """

// ====== 素材检索 ======
async function handleMaterialSearch() {
  if (!requireLogin()) return;
  const prompt = document.getElementById('mat-prompt').value.trim();
  if (!prompt) { showToast('请输入提示词/需求描述'); return; }

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

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

  try {
    // 1. 调用 Ollama 生成3条素材文案
    const copyPrompt = `你是一位资深广告文案策划。根据以下需求，生成3条不同的广告素材文案（每条100字以内），要吸引人、有转化率。
需求：${prompt}
行业：${industry || '不限'}
素材类型：${materialType || '不限'}
主色调：${color || '不限'}
其他需求：${otherReq || '无'}

请按以下 JSON 格式返回：
[{"title": "文案标题", "body": "文案正文", "style": "风格标签"}, ...]
只返回 JSON，不要其他解释。`;

    let copyList = [];
    try {
      const resp = await fetch(`${PORTAL_URL}/api/ollama/generate`, {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({model: 'qwen3:8b', prompt: copyPrompt, stream: 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: '文案方案1', body: prompt + ' —— 请登录后使用完整功能获取AI生成文案。', style: '通用'},
      ];
    }

    // 显示文案
    const copyListEl = document.getElementById('mat-copy-list');
    copyListEl.innerHTML = '';
    copyList.forEach((item, i) => {
      const div = document.createElement('div');
      div.className = 'copy-card';
      div.style.cssText = 'background:#f8fafc;border:1px solid var(--border);border-radius:8px;padding:14px 16px;margin-bottom:10px;';
      div.innerHTML = `
        <div style="font-size:11px;color:var(--primary);font-weight:600;margin-bottom:4px;">方案 ${i+1} · ${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;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)">📋 复制</button>
        </div>`;
      copyListEl.appendChild(div);
    });
    document.getElementById('mat-results-card').style.display = '';

    // 2. 从知识库检索素材
    let materials = [];
    try {
      const kbResp = await fetch(`${PORTAL_URL}/api/knowledge/list`, {
        headers: { 'Authorization': `Bearer ${authToken}` }
      });
      const kbData = await kbResp.json();
      if (kbData.files) {
        materials = kbData.files.filter(f => {
          if (materialType && f.category) {
            if (materialType === '图片' && !f.category.includes('图片') && !f.category.includes('素材')) return false;
            if (materialType === '视频' && !f.category.includes('视频') && !f.category.includes('素材')) return false;
          }
          return true;
        }).slice(0, 6);
      }
    } catch(e) { console.error('Knowledge base error:', e); }

    // 显示素材
    const grid = document.getElementById('mat-material-grid');
    const empty = document.getElementById('mat-material-empty');
    grid.innerHTML = '';
    if (materials.length === 0) {
      empty.style.display = '';
    } else {
      empty.style.display = 'none';
      materials.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;';
        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 || '未分类'} · ${m.upload_time || ''}</div>`;
        grid.appendChild(div);
      });
    }
    document.getElementById('mat-materials-card').style.display = '';

    // 保存记录
    saveRecord('material_search', '素材检索: ' + prompt.substring(0, 50), 
      '提示词: ' + prompt + '<br>行业: ' + industry + '<br>生成文案数: ' + copyList.length,
      { prompt, industry, material_type: materialType });

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

// ====== 案例推荐 ======
async function handleCaseSearch() {
  if (!requireLogin()) return;
  const prompt = document.getElementById('case-prompt').value.trim();
  if (!prompt) { showToast('请输入提示词/案例需求'); return; }

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

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

  try {
    // 1. 从知识库检索案例
    let cases = [];
    try {
      const kbResp = await fetch(`${PORTAL_URL}/api/knowledge/list`, {
        headers: { 'Authorization': `Bearer ${authToken}` }
      });
      const kbData = await kbResp.json();
      if (kbData.files) {
        cases = kbData.files.filter(f => {
          const cat = (f.category || '').toLowerCase();
          if (cat.includes('案例') || cat.includes('case')) return true;
          const fname = (f.filename || '').toLowerCase();
          if (industry && fname.includes(industry.toLowerCase())) return true;
          return false;
        }).slice(0, 6);
      }
    } catch(e) { console.error('Knowledge base error:', e); }

    // 2. 如果知识库没有，调用 Ollama 生成推荐案例
    if (cases.length === 0) {
      try {
        const aiPrompt = `你是一位资深广告优化师。根据以下需求，推荐3个相关的广告案例（可以是已知的经典案例），每个案例包含：案例名称、行业、平台、核心数据（点击率/转化率等）、亮点分析。
需求：${prompt}
行业：${industry || '不限'}
数据维度：${dimensions || '不限'}
平台：${platform || '不限'}

请按以下 JSON 格式返回：
[{"name": "案例名称", "industry": "行业", "platform": "平台", "metrics": {"点击率": "X%", "转化率": "Y%"}, "highlights": ["亮点1", "亮点2"]}, ...]
只返回 JSON，不要其他解释。`;

        const resp = await fetch(`${PORTAL_URL}/api/ollama/generate`, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify({model: 'qwen3:8b', prompt: aiPrompt, stream: false})
        });
        const data = await resp.json();
        const text = data.response || data.message || '';
        const jsonMatch = text.match(/\\[.*\\]/s);
        if (jsonMatch) {
          const aiCases = JSON.parse(jsonMatch[0]);
          cases = aiCases.map((c, i) => ({
            id: 'ai_' + i, filename: c.name || 'AI推荐案例', category: '案例',
            industry: c.industry || '', platform: c.platform || '',
            metrics: c.metrics || {}, highlights: c.highlights || []
          }));
        }
      } catch(e) { console.error('Ollama error:', e); }
    }

    // 3. 显示案例
    const grid = document.getElementById('case-grid');
    const empty = document.getElementById('case-empty');
    grid.innerHTML = '';
    if (cases.length === 0) {
      empty.style.display = '';
    } else {
      empty.style.display = 'none';
      cases.forEach(c => {
        const div = document.createElement('div');
        div.className = 'case-card';
        div.style.cssText = 'border:1px solid var(--border);border-radius:10px;overflow:hidden;padding:14px;margin-bottom:10px;cursor:pointer;transition:all 0.2s;';
        const metricsHtml = c.metrics ? Object.entries(c.metrics).map(([k,v]) => `<span style="font-size:11px;padding:3px 8px;border-radius:99px;background:#ede9fe;color:#6366f1;margin-right:4px;">${k}: ${v}</span>`).join('') : '';
        div.innerHTML = `
          <div style="font-size:15px;font-weight:600;margin-bottom:6px;">${c.filename || c.name || '案例'}</div>
          <div style="font-size:13px;color:var(--text-secondary);line-height:1.5;margin-bottom:10px;">行业：${c.industry || ''} · 平台：${c.platform || ''}</div>
          <div>${metricsHtml}</div>
          <div style="font-size:11px;color:var(--text-secondary);margin-top:10px;">来源：${c.upload_time || 'AI推荐'}</div>`;
        grid.appendChild(div);
      });
    }
    document.getElementById('case-results-card').style.display = '';

    // 保存记录
    saveRecord('case_recommend', '案例推荐: ' + prompt.substring(0, 50),
      '需求: ' + prompt + '<br>行业: ' + industry + '<br>推荐案例数: ' + cases.length,
      { prompt, industry, platform });

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

// ====== 账户搭建 ======
async function handleAccountSetup() {
  if (!requireLogin()) return;
  const prompt = document.getElementById('acct-prompt').value.trim();
  const industry = document.getElementById('acct-industry').value;
  const platform = document.getElementById('acct-platform').value;
  const budget = document.getElementById('acct-budget').value.trim();
  const ageRange = document.getElementById('acct-age-range').value.trim();

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

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

  try {
    const aiPrompt = `你是一位资深广告投放专家。根据以下信息，生成完整的账户搭建方案。
推广目标：${prompt}
行业：${industry}
推广平台：${platform}
投放预算：${budget || '待定'}
目标人群年龄段：${ageRange || '待定'}

请按以下 JSON 格式返回（不要其他解释文字）：
{
  "flow": [{"step": 1, "title": "步骤标题", "desc": "步骤说明"}, ...],
  "copy": "推荐的推广文案（150字以内）",
  "materials": [{"type": "素材类型（图片/视频/文案）", "desc": "素材描述"}],
  "budget": [{"item": "投放项", "amount": "金额/比例", "note": "说明"}],
  "audience": [{"tag": "人群标签", "desc": "说明"}]
}
只返回 JSON，不要其他解释。`;

    let result = null;
    try {
      const resp = await fetch(`${PORTAL_URL}/api/ollama/generate`, {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({model: 'qwen3:8b', prompt: aiPrompt, stream: 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('Ollama error:', e); }

    // 如果 AI 失败，用默认方案
    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扩量'}
        ]
      };
    }

    // 显示结果
    // 1. 搭建流程
    const flowEl = document.getElementById('acct-flow-steps');
    flowEl.innerHTML = '';
    (result.flow || []).forEach(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);
    });

    // 2. 推广文案
    document.getElementById('acct-copy-preview').textContent = result.copy || '暂无文案';

    // 3. 素材规划
    const matEl = document.getElementById('acct-material-plan');
    matEl.innerHTML = '';
    (result.materials || []).forEach(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);
    });

    // 4. 预算分配
    const budEl = document.getElementById('acct-budget-grid');
    budEl.innerHTML = '';
    (result.budget || []).forEach(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);
    });

    // 5. 目标人群
    const audEl = document.getElementById('acct-audience-tags');
    audEl.innerHTML = '';
    (result.audience || []).forEach(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);
    });

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

    // 保存记录
    saveRecord('account_setup', '账户搭建: ' + prompt.substring(0, 50),
      '推广目标: ' + prompt + '<br>行业: ' + industry + '<br>平台: ' + platform,
      { prompt, industry, platform, budget });

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

# 在 </script> 之前插入新 JS 函数
script_end = content.rfind('</script>')
if script_end == -1:
    print("ERROR: 找不到 </script> 标签！")
    exit(1)

content = content[:script_end] + new_js + '\n' + content[script_end:]

# 写回文件
with open(PORTAL, 'w', encoding='utf-8') as f:
    f.write(content)

print("\n🎉 全部完成！")
print("已整合：素材检索、案例推荐、账户搭建 → 内联面板 + 历史记录")
print(f"文件总行数: {content.count(chr(10))}")
