<?php
require __DIR__ . '/../../app/bootstrap.php';
require __DIR__ . '/../../app/database.php';
require __DIR__ . '/_ai-helpers.php';
require_login();

header('Content-Type: application/json; charset=utf-8');

$fileKey = isset($_POST['file_key']) ? trim((string)$_POST['file_key']) : '';
$packCode = isset($_POST['pack_code']) ? trim((string)$_POST['pack_code']) : '';
$instruction = isset($_POST['instruction']) ? trim((string)$_POST['instruction']) : '';
$currentContent = isset($_POST['current_content']) ? (string)$_POST['current_content'] : '';
$modelId = isset($_POST['model_id']) ? (int)$_POST['model_id'] : 0;

if ($fileKey === '' || $packCode === '') {
    echo json_encode(array('success' => false, 'error' => '缺少必要参数。'));
    exit;
}

$model = null;
if ($modelId > 0) {
    $model = find_ai_model_by_id($modelId);
    if (!$model || $model['status'] !== 'enabled') {
        $model = null;
    }
}
if (!$model) {
    $model = find_first_enabled_ai_model();
}
if (!$model) {
    echo json_encode(array('success' => false, 'error' => '未配置启用的AI模型，请先在AI模型管理中配置。'));
    exit;
}

$vars = template_variables_for_file_key($fileKey);
$fileKeys = template_pack_file_keys();
$fileLabel = isset($fileKeys[$fileKey]) ? $fileKeys[$fileKey] : $fileKey;

$manifest = load_template_pack_manifest($packCode);
$packName = $manifest ? (isset($manifest['name']) ? $manifest['name'] : $packCode) : $packCode;
$packType = $manifest ? (isset($manifest['pack_type']) ? (string)$manifest['pack_type'] : 'variation') : 'variation';
$cssPrefix = preg_replace('/[^a-z0-9]/', '-', strtolower($packCode));

$systemPrompt = <<<PROMPT
你是一个专业的前端HTML模板工程师，专门为"蜜蜂AI建站"平台生成HTML模板。
当前模板套件：「{$packName}」({$packCode})

【核心规则——必须严格遵守，违反任何一条视为失败】
1. 只输出纯代码，绝对不要用markdown代码块包裹，不要输出解释性文字
2. 自定义CSS class统一使用前缀 .{$cssPrefix}-  避免冲突
3. 结构语义化、响应式友好、SEO优化（合理使用h1-h6、meta、alt、aria等）
4. 如果用户提供了现有代码，在其基础上修改而非全部重写（除非用户明确要求重写）
5. 禁止添加文档之外的模板变量，只能使用下方提供的变量列表中存在的变量
6. 每个变量只输出一次，严禁同一个变量在页面中出现两次（特别是广告位变量）
7. 系统只支持简单的 {{变量名}} 占位符替换，严禁使用 Mustache/Handlebars 条件语法如 {{#var}}...{{/var}}、{{^var}}等

【header.html / footer.html 是片段，不是完整页面】
- header.html 和 footer.html 通过 {{header}} / {{footer}} 注入到 homepage/article/archive 页面中
- 因此它们绝对不能包含 <!DOCTYPE>、<html>、<head>、<body> 等文档级标签
- header.html 只输出 <style>...</style><header>...</header> 片段
- footer.html 只输出 <style>...</style><footer>...</footer> 片段
- 全局CSS变量（:root）、CSS Reset、body样式 必须写在 style.css 中（会自动注入），不要写在 header/footer 中

【style.css 和 script.js 自动注入机制——极重要】
- 系统会自动将 style.css 的内容以 <style> 标签注入到每个页面的 <head> 中
- 系统会自动将 script.js 的内容以 <script> 标签注入到每个页面的 </body> 前
- 因此：CSS Reset、:root变量、body基础样式、系统类名样式（.article-list-card/.article-card/.random-article-link/.header-dark系列）已在 style.css 中，页面文件不需要重复
- 页面内 <style> 只写该页面独有的布局和区块样式

【homepage.html / article.html / archive.html 是完整页面】
- 必须包含完整的 <!DOCTYPE html> 结构（含 <head>、<body>）
- <head> 中可写 <style> 但只放本页独有的CSS（不要重复 style.css 已有的内容）

【变量使用规则——严格遵守】
- 每个变量最多使用一次，不要重复输出
- 广告位变量（article_ad_top/middle/bottom/sidebar）直接用 <div> 包裹输出，变量本身就是完整HTML
- {{archive_content}} 已包含文章卡片+分页，使用后不要再用 {{archive_cards}} 或 {{archive_pagination}}
- {{search_box}} 是系统生成的完整搜索框HTML，使用后不要再手动编写搜索框HTML
- 不要臆造 mod_* 变量名（如 mod_address、mod_phone 等），除非用户明确要求

【JS 防 WAF 拦截——绝对禁止的写法】
- 禁止 class/constructor（用普通 function 替代）
- 禁止模板字面量（用字符串拼接替代）
- 禁止 window.location.href = url（用动态创建 form 提交替代）
- 禁止 ...args 展开运算符（用 arguments 或显式参数替代）
- 禁止 eval()/Function()/document.write()/document.cookie
- 整个 script 用 IIFE 包裹：(function(){ 'use strict'; ... })();

【CSS 系统类名——这些是系统固定输出的HTML类名，不加自定义前缀】
栏目页文章卡片：.article-list-card / .article-list-card-link（a标签，必须 text-decoration:none !important; color:inherit !important;）/ .article-list-thumb / .article-list-thumb img / .article-list-time / .article-list-body / .article-list-title / .article-list-desc
文章页相关文章：.article-card（a标签，必须 display:inline-block !important; text-decoration:none !important; 并设置百分比宽度实现3~4列）/ .article-card-thumb / .article-card-thumb img / .article-card-title
随机推荐：.random-article-link（a标签，必须 display:flex !important; text-decoration:none !important; 每条独占一行）/ .random-article-index / .random-article-text
导航深色模式（用于栏目页/文章页无Hero时导航可读）：
  .header-dark 只做占位撑高（padding-top:70px），不设背景色
  .header-dark .{$cssPrefix}-header 设置深色背景（header是position:fixed，背景必须加在fixed元素上）
  .header-dark .menu-nav a 白色文字
注意：以上系统类名不要加 .{$cssPrefix}- 前缀！（.header-dark 是系统类名；.{$cssPrefix}-header 是自定义类名）

【侧边栏/推荐区标题规则】
系统生成的 {{archive_sidebar}}、{{related_articles}}、{{random_articles}} 不含标题，模板HTML中必须手动在变量前添加 <h3> 标题。

【颜色对比度——极重要】
- 所有文本与背景必须有明显的颜色反差：深色背景用浅色/白色文字，浅色背景用深色文字
- 导航栏：深色背景→白色文字，浅色背景→深色文字，确保清晰可读
- 按钮：必须有醒目的背景色和对比鲜明的文字颜色，不要和背景混为一体
- 禁止文字颜色与背景颜色相近的情况
PROMPT;

// 根据 pack_type 追加 CSS 变量约束
if ($packType === 'variation') {
    $systemPrompt .= <<<'VARIATION_RULES'

【变异引擎适配——本模板为变体类型，必须严格遵守】
本模板参与变异引擎，同一套模板在不同域名下会呈现不同的配色、字体、圆角和间距。
1. :root 中的主色、强调色、背景色、圆角变量必须使用 var(--v-xxx, 默认值) 语法
2. CSS 中所有与主色相关的颜色值禁止硬编码 RGB/HEX，必须引用 var(--primary-color) 等变量
3. font-family 禁止使用 !important（变异引擎通过 !important 覆盖字体）
4. 交替背景区块必须使用 var(--bg-subtle)，深色区域使用 var(--dark-bg)
VARIATION_RULES;
} else {
    $systemPrompt .= <<<'STANDARD_RULES'

【固定样式模板——本模板为常规类型，CSS直接写死】
本模板不参与变异引擎，所有域名使用相同外观。
1. :root 中的颜色、字体、圆角、间距全部直接写死（不需要 var(--v-xxx) 语法）
2. 每个模板应有独特的色彩方案，追求视觉完整性和独特性
3. 字体可自由使用 !important，无变异引擎冲突
STANDARD_RULES;
}

$fileTypeGuide = '';
switch ($fileKey) {
    case 'homepage':
        $fileTypeGuide = "这是【首页模板】（完整HTML页面），必须包含 {{header}} 和 {{footer}} 占位符。<style>中只写首页独有的区块CSS，不要重复 style.css 已有的系统类名和Reset。支持两种首页模式：A-企业营销型（默认）使用hero_*、services_*、feature_*、testimonial_*、cta_* 等变量 + {{latest_articles}}；B-资讯门户型（当用户要求新闻/资讯/文章列表型首页）核心内容用 {{menu_articles_sections}}（系统自动按菜单栏目分区生成文章卡片列表），首屏简洁banner即可，不需要营销型板块。根据用户指令或已有代码判断使用哪种模式。";
        break;
    case 'article':
        $fileTypeGuide = "这是【文章详情页模板】（完整HTML页面）。<style>中只写文章页独有的布局CSS（两栏布局、文章容器、侧边栏），不要重复style.css已有的系统类名样式。建议布局：左侧主内容+右侧侧边栏。主内容顺序：{{breadcrumb}} → <h1>{{title}}</h1> → {{article_date}} → {{article_ad_top}} → {{content}} → {{article_ad_middle}} → {{keyword_links}} → {{article_ad_bottom}}。禁止使用 {{cover_image}} 变量（封面图已包含在 {{content}} 正文中，单独输出会重复）。每个广告位变量只输出一次。侧边栏：<h3>相关文章</h3>{{related_articles}} + <h3>随机推荐</h3>{{random_articles}} + {{article_ad_sidebar}}。建议用 <div class=\"header-dark\">{{header}}</div> 包裹页头。";
        break;
    case 'archive':
        $fileTypeGuide = "这是【栏目列表页模板】（完整HTML页面）。<style>中只写栏目页独有的布局CSS，不要重复style.css已有的系统类名样式。布局：左侧主内容+右侧侧边栏。主内容区：{{breadcrumb}} → {{archive_content}}。重要：{{archive_content}} 已包含文章卡片+分页，不要再用 {{archive_cards}} 或 {{archive_pagination}}。侧边栏：<h3>侧边栏标题</h3>{{archive_sidebar}}（必须加h3标题）。建议用 <div class=\"header-dark\">{{header}}</div> 包裹页头。";
        break;
    case 'header':
        $fileTypeGuide = "这是【全局页头模板】（HTML片段，不是完整页面）。禁止输出 <!DOCTYPE>、<html>、<head>、<body>。只输出 <style>...</style><header>...</header>。必须包含 {{site_name}} 和 {{menu_nav}}。不要写 CSS Reset、body 样式或 :root 变量。";
        break;
    case 'footer':
        $fileTypeGuide = "这是【全局页脚模板】（HTML片段，不是完整页面）。禁止输出 <!DOCTYPE>、<html>、<head>、<body>。只输出 <style>...</style><footer>...</footer>。必须包含 {{footer_text}}、{{year}}、{{friend_links}}、{{cross_site_articles}}。不要写 CSS Reset 或 body 样式。不要臆造 mod_* 变量。禁止硬编码导航链接。根据用户指令判断风格：企业型可多栏布局；资讯/新闻/博客型用极简单行页脚（版权+友链），不要多栏、不要快速导航。";
        break;
    case 'css':
        $fileTypeGuide = "这是【共享CSS样式表】——全局共享，系统自动注入到每个页面<head>中。必须包含：CSS Reset、:root变量、body基础样式、系统类名完整样式（不加自定义前缀）：.article-list-card 系列、.article-card 系列、.random-article-link 系列。.header-dark 只做 padding-top 占位撑高（不加背景色），深色背景加在 .header-dark .{$cssPrefix}-header 上（因为header是fixed定位）。页面文件不会再重复这些内容。";
        break;
    case 'js':
        $fileTypeGuide = "这是【共享JS脚本】——全局共享，系统自动注入到每个页面</body>前。用IIFE包裹，包含滚动动画、平滑锚点等共享功能。WAF安全：禁止class/模板字面量/window.location.href赋值。";
        break;
}

$userMessage = "## 任务\n\n";
$userMessage .= "当前编辑的模板套件：{$packName}（编码：{$packCode}）\n";
$userMessage .= "当前编辑的文件：{$fileLabel}（{$fileKey}）\n\n";

if ($fileTypeGuide !== '') {
    $userMessage .= "## 文件类型说明\n\n{$fileTypeGuide}\n\n";
}

$userMessage .= "## 当前文件可用的模板变量（必须在生成的HTML中使用这些变量）\n\n";
$userMessage .= "以下变量会在发布时被系统自动替换为实际内容，请在HTML中用 {{变量名}} 格式引用：\n\n";
foreach ($vars as $var => $label) {
    $userMessage .= "- " . $var . " — " . $label . "\n";
}
$userMessage .= "\n";

if ($instruction !== '') {
    $userMessage .= "## 用户指令\n\n" . $instruction . "\n\n";
}

if (trim($currentContent) !== '') {
    $userMessage .= "## 当前模板代码（请在此基础上修改）\n\n" . $currentContent;
} else {
    $userMessage .= "## 当前状态\n\n模板为空，请根据上述文件类型、可用变量列表生成一个完整的HTML模板（含内联CSS样式）。";
}

$apiUrl = isset($model['api_url']) ? trim((string)$model['api_url']) : '';
$apiKey = isset($model['api_key']) ? trim((string)$model['api_key']) : '';

if ($apiUrl === '' || $apiKey === '') {
    echo json_encode(array('success' => false, 'error' => 'AI模型API地址或Key未配置。'));
    exit;
}

$requestConfig = array();
if (isset($model['request_config']) && trim((string)$model['request_config']) !== '') {
    $decoded = json_decode($model['request_config'], true);
    if (is_array($decoded)) {
        $requestConfig = $decoded;
    }
}

$modelName = isset($requestConfig['model']) ? $requestConfig['model'] : (isset($model['model_name']) ? $model['model_name'] : '');

// 收集额外请求头
$extraHeaders = array();
if (isset($model['request_headers']) && trim((string)$model['request_headers']) !== '') {
    $parsedHeaders = json_decode($model['request_headers'], true);
    if (is_array($parsedHeaders)) {
        foreach ($parsedHeaders as $hk => $hv) {
            $extraHeaders[] = $hk . ': ' . $hv;
        }
    }
}

// 使用带自动续写的AI调用
$aiResult = call_ai_with_continuation(
    $apiUrl, $apiKey, $extraHeaders, $modelName,
    $systemPrompt, $userMessage, $fileKey,
    0, // 使用默认 max_tokens
    0.7
);

if (!$aiResult['success']) {
    echo json_encode(array('success' => false, 'error' => $aiResult['error']));
    exit;
}

$assistantText = $aiResult['content'];

if ($assistantText === '') {
    echo json_encode(array('success' => false, 'error' => 'AI未返回有效内容。'));
    exit;
}

$response = array(
    'success'       => true,
    'html'          => $assistantText,
    'model'         => $modelName,
    'continuations' => isset($aiResult['continuations']) ? (int)$aiResult['continuations'] : 0
);
if (isset($aiResult['warning']) && $aiResult['warning'] !== '') {
    $response['warning'] = $aiResult['warning'];
}
echo json_encode($response);
