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

header('Content-Type: text/event-stream; charset=utf-8');
header('Cache-Control: no-cache');
header('X-Accel-Buffering: no');

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo "data: " . json_encode(array('error' => '仅支持 POST 请求。')) . "\n\n";
    exit;
}

// 处理 JSON 或 POST 格式的请求
$input = array();
$contentType = isset($_SERVER['CONTENT_TYPE']) ? trim((string)$_SERVER['CONTENT_TYPE']) : '';
if (strpos($contentType, 'application/json') !== false) {
    $rawInput = file_get_contents('php://input');
    $input = json_decode($rawInput, true);
    if (!is_array($input)) $input = array();
} else {
    require_csrf();
    $input = $_POST;
}

$menuNames = isset($input['menu_names']) ? trim((string)$input['menu_names']) : '';
$quantity   = isset($input['quantity']) ? (int)$input['quantity'] : 50;
$modelId    = isset($input['model_id']) ? (int)$input['model_id'] : 0;
$domainId   = isset($input['domain_id']) ? (int)$input['domain_id'] : 0;
$siteLanguage = isset($input['site_language']) ? trim((string)$input['site_language']) : 'zh-CN';
$domain = $domainId > 0 ? find_domain_by_id($domainId) : null;
if ($domain) {
    $siteLanguage = domain_site_language($domain);
}
$isEnglish = ($siteLanguage === 'en-US' || $siteLanguage === 'en-GB');

if ($menuNames === '') {
    echo "data: " . json_encode(array('error' => '请先选择目标菜单。'), JSON_UNESCAPED_UNICODE) . "\n\n";
    exit;
}
if ($quantity < 1) $quantity = 50;
if ($quantity > 500) $quantity = 500;
if ($modelId < 1) {
    echo "data: " . json_encode(array('error' => '请选择 AI 模型。'), JSON_UNESCAPED_UNICODE) . "\n\n";
    exit;
}

try {
    $model = find_ai_model_by_id($modelId);
    if (!$model || $model['status'] !== 'enabled') {
        throw new Exception('所选模型不可用或已禁用。');
    }

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

    if ($apiUrl === '' || !filter_var($apiUrl, FILTER_VALIDATE_URL)) {
        throw new Exception('当前模型配置的 API 地址无效。');
    }
    if ($apiKey === '') {
        throw new Exception('当前模型未配置 API Key。');
    }

    // 根据语言生成对应的提示词
    $systemPrompt = '';
    $userPrompt = '';
    
    if ($siteLanguage === 'en-US' || $siteLanguage === 'en-GB') {
        $systemPrompt = 'You are a professional English SEO keyword researcher. The user gives you core menu names and a required quantity. Generate exactly that many English long-tail keywords.\n\nStrict rules:\n1. One keyword per line, all in English\n2. No numbering, no #, no bullets, no prefixes\n3. Do not explain, do not add titles or categories, output keywords only\n4. Output exactly the requested number, no more, no less\n5. Every keyword must be unique\n6. Keywords should cover different search intents and angles\n\nOutput keywords line by line only, with no extra text.';
        $userPrompt = 'Core keywords: ' . $menuNames . "\nGenerate exactly " . $quantity . " keywords, no more and no less, no duplicates.";
    } elseif ($siteLanguage === 'ja-JP') {
        $systemPrompt = '日本語のSEOキーワード研究の専門家です。ユーザーがコアキーワードと数量を指定します。正確にその数の日本語ロングテールキーワードを生成してください。\n\n厳密なルール：\n1. 1行に1つのキーワード、すべて日本語\n2. 番号、#、序号、マーク、ドットなどのプレフィックスは禁止\n3. 説明や分類を追加しないでください。キーワードのみを出力してください\n4. 指定された数量を正確に出力し、超過は禁止です\n5. 各キーワードは一意である必要があります。重複は禁止です\n6. キーワードは多様化し、異なる検索意図をカバーしてください\n\nキーワードを行ごとに出力するだけで、他のテキストは出力しないでください。';
        $userPrompt = 'コアキーワード：' . $menuNames . "\n正確に " . $quantity . " 個のキーワードを生成してください（多くも少なくもなく、重複なし）。";
    } elseif ($siteLanguage === 'ko-KR') {
        $systemPrompt = '한국어 SEO 키워드 연구 전문가입니다. 사용자가 핵심 키워드와 수량을 제공합니다. 정확히 그 수의 한국어 롱테일 키워드를 생성하세요.\n\n엄격한 규칙:\n1. 한 줄에 하나의 키워드, 모두 한국어\n2. 번호, #, 순서, 마크, 점 등의 접두사 금지\n3. 설명이나 분류를 추가하지 마세요. 키워드만 출력하세요\n4. 지정된 수량을 정확히 출력하고 초과 금지\n5. 각 키워드는 고유해야 합니다. 중복 금지\n6. 키워드는 다양화되어 다양한 검색 의도를 포함해야 합니다\n\n키워드를 줄 단위로만 출력하고 다른 텍스트는 출력하지 마세요.';
        $userPrompt = '핵심 키워드: ' . $menuNames . "\n정확히 " . $quantity . " 개의 키워드를 생성하세요(많지도 적지도 않게, 중복 없음).";
    } elseif ($siteLanguage === 'zh-TW') {
        $systemPrompt = '你是一位專業的繁體中文SEO關鍵詞研究專家。用戶給你核心詞和數量，你精確生成對應數量的繁體中文長尾關鍵詞。\n\n嚴格規則：\n1. 每行一個關鍵詞，全部繁體中文\n2. 禁止編號、#號、序號、標記、圓點等任何前綴\n3. 不要解釋、標題、分類名，只輸出純關鍵詞\n4. 嚴格按指定數量輸出，到數即停，絕對禁止超出\n5. 每個關鍵詞必須不同，嚴禁重複\n6. 關鍵詞要多樣化，覆蓋不同搜索意圖和角度\n\n直接逐行輸出關鍵詞，不要輸出其他任何內容。';
        $userPrompt = '核心關鍵詞：' . $menuNames . "\n精確生成 " . $quantity . " 個關鍵詞（不多不少，嚴禁超出，嚴禁重複）。";
    } else {
        // 默认中文（zh-CN）
        $systemPrompt = '你是一位专业的中文SEO关键词研究专家。用户给你核心词和数量，你精确生成对应数量的中文长尾关键词。\n\n严格规则：\n1. 每行一个关键词，全部中文\n2. 禁止编号、#号、序号、标记、圆点等任何前缀\n3. 不要解释、标题、分类名，只输出纯关键词\n4. 严格按指定数量输出，到数即停，绝对禁止超出\n5. 每个关键词必须不同，严禁重复\n6. 关键词要多样化，覆盖不同搜索意图和角度\n\n直接逐行输出关键词，不要输出其他任何内容。';
        $userPrompt = '核心关键词：' . $menuNames . "\n精确生成 " . $quantity . " 个关键词（不多不少，严禁超出，严禁重复）。";
    }
    
    $messages = array(
        array(
            'role' => 'system',
            'content' => $systemPrompt
        ),
        array(
            'role' => 'user',
            'content' => $userPrompt
        )
    );

    $maxTokens = max(1200, $quantity * 15);
    if ($maxTokens > 8000) $maxTokens = 8000;

    $payload = array(
        'model' => isset($model['model_name']) ? (string)$model['model_name'] : '',
        'messages' => $messages,
        'stream' => true,
        'max_tokens' => $maxTokens,
        'temperature' => 0.9
    );

    $payloadJson = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

    $headers = array(
        'Content-Type: application/json',
        'Accept: text/event-stream',
        'Authorization: Bearer ' . $apiKey
    );

    $ch = curl_init($apiUrl);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $payloadJson);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 180);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

    $inThink = false;
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) use (&$inThink) {
        $lines = explode("\n", $data);
        foreach ($lines as $line) {
            $line = trim($line);
            if ($line === '' || $line === 'data: [DONE]') continue;
            if (strpos($line, 'data: ') === 0) {
                $json = json_decode(substr($line, 6), true);
                if (is_array($json) && isset($json['choices'][0]['delta']['content'])) {
                    $content = $json['choices'][0]['delta']['content'];
                    if (strpos($content, '<think>') !== false) $inThink = true;
                    if ($inThink) {
                        if (strpos($content, '</think>') !== false) { $inThink = false; }
                        // skip thinking content
                    } else {
                        echo "data: " . json_encode(array('text' => $content), JSON_UNESCAPED_UNICODE) . "\n\n";
                        if (ob_get_level()) ob_flush();
                        flush();
                    }
                }
            }
        }
        return strlen($data);
    });

    curl_exec($ch);
    $curlError = curl_error($ch);
    $httpCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($curlError !== '') {
        echo "data: " . json_encode(array('error' => '调用 AI 接口失败：' . $curlError), JSON_UNESCAPED_UNICODE) . "\n\n";
    }

    echo "data: [DONE]\n\n";
    if (ob_get_level()) ob_flush();
    flush();

} catch (Exception $e) {
    echo "data: " . json_encode(array('error' => $e->getMessage()), JSON_UNESCAPED_UNICODE) . "\n\n";
}
