<?php

namespace App\Services;

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;

class PromptService
{
    protected string $baseUrl;

    public function __construct()
    {
        // 从配置文件读取base_url
        $this->baseUrl = config('services.question_bank.base_url', env('QUESTION_BANK_API_BASE', 'http://localhost:5015'));
        $this->baseUrl = rtrim($this->baseUrl, '/');
    }

    /**
     * 获取提示词列表
     */
    public function listPrompts(?string $type = null, ?string $active = null): array
    {
        try {
            $query = array_filter([
                'type' => $type,
                'active' => $active,
            ], fn($value) => filled($value));

            $response = Http::timeout(10)
                ->get($this->baseUrl . '/prompts', $query);

            if ($response->successful()) {
                return $response->json();
            }

            Log::warning('获取提示词列表失败', [
                'status' => $response->status()
            ]);
        } catch (\Exception $e) {
            Log::error('获取提示词列表异常', [
                'error' => $e->getMessage()
            ]);
        }

        return [];
    }

    /**
     * 保存提示词
     */
    public function savePrompt(array $data): array
    {
        try {
            // 先尝试更新
            $response = Http::timeout(10)
                ->put($this->baseUrl . '/prompts/default', $data);

            // 如果更新失败（可能不存在），则尝试创建
            if (!isset($response->json()['success']) || !$response->json()['success']) {
                $response = Http::timeout(10)
                    ->post($this->baseUrl . '/prompts', $data);
            }

            if ($response->successful()) {
                return $response->json();
            }

            Log::warning('保存提示词失败', [
                'status' => $response->status()
            ]);
        } catch (\Exception $e) {
            Log::error('保存提示词异常', [
                'error' => $e->getMessage()
            ]);
        }

        return ['success' => false, 'message' => '保存失败'];
    }

    /**
     * 获取默认提示词模板
     */
    public function getDefaultPromptTemplate(): string
    {
        return '你是资深的中学数学命题专家，请为{knowledge_point}知识点生成高质量题目。

【核心要求】
1. 题目必须符合{grade_level}年级水平
2. 难度分布：基础({basic_ratio}%) + 中等({intermediate_ratio}%) + 拔高({advanced_ratio}%)
3. 题型分配：选择题({choice}道) + 填空题({fill}道) + 解答题({solution}道)

【技能覆盖】
{skill_coverage}

【图示处理】
- 如果原题涉及图形/示意图/坐标系/几何草图，必须在题干内内嵌一段完整的 <svg> 标签来还原图形；不要使用外链图片、base64 或占位符。
- SVG 要包含明确的宽高（建议 260~360 像素），只使用基础图元（line、rect、circle、polygon、path、text），并给出必要的坐标、角点和标注文本。
- 确保题干文本描述与 SVG 一致，例如“如图所示”后紧跟 SVG，且 SVG 放在题干末尾即可被前端直接渲染。

【质量标准】
- 准确性：100%正确
- 多样性：避免重复
- 梯度性：难度递进合理
- 实用性：贴近实际应用

【输出格式】
{
  "total": {count},
  "questions": [
    {
      "id": "唯一标识",
      "stem": "题干",
      "answer": "标准答案",
      "solution": "详细解答",
      "difficulty": 难度值(0.3/0.6/0.85),
      "skill": "关联技能"
    }
  ]
}';
    }

    /**
     * 检查服务健康状态
     */
    public function checkHealth(): bool
    {
        try {
            $response = Http::timeout(5)
                ->get($this->baseUrl . '/health');

            return $response->successful();
        } catch (\Exception $e) {
            Log::error('提示词服务健康检查失败', [
                'error' => $e->getMessage()
            ]);
            return false;
        }
    }
}
