package system

import (
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"net/http"
	"strings"

	"github.com/go-kratos/kratos/v2/log"
	"kra/internal/conf"
)

// AutoCodeLLMUsecase LLM用例
type AutoCodeLLMUsecase struct {
	config *conf.AutoCodeLLMConfig
	log    *log.Helper
}

// NewAutoCodeLLMUsecase 创建LLM用例
func NewAutoCodeLLMUsecase(config *conf.AutoCodeLLMConfig, logger log.Logger) *AutoCodeLLMUsecase {
	return &AutoCodeLLMUsecase{
		config: config,
		log:    log.NewHelper(logger),
	}
}

// LLMResponse LLM响应结构
type LLMResponse struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data"`
}

// LLMAuto 调用大模型服务，返回生成结果数据
// 入参为通用 JSONMap，需包含 mode（例如 ai/butler/eye/painter 等）以及业务 prompt/payload
func (uc *AutoCodeLLMUsecase) LLMAuto(ctx context.Context, llm map[string]interface{}) (interface{}, error) {
	if uc.config.AiPath == "" {
		return nil, errors.New("请先前往插件市场个人中心获取AiPath并填入配置文件中")
	}

	// 构建调用路径：{AiPath} 中的 {FUNC} 由 mode 替换
	mode := fmt.Sprintf("%v", llm["mode"])
	path := strings.ReplaceAll(uc.config.AiPath, "{FUNC}", fmt.Sprintf("api/chat/%s", mode))

	// 构建请求体
	body, err := json.Marshal(llm)
	if err != nil {
		return nil, fmt.Errorf("序列化请求失败: %w", err)
	}

	// 发送HTTP请求
	req, err := http.NewRequestWithContext(ctx, "POST", path, strings.NewReader(string(body)))
	if err != nil {
		return nil, fmt.Errorf("创建请求失败: %w", err)
	}
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	res, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("大模型生成失败: %w", err)
	}
	defer res.Body.Close()

	// 读取响应
	b, err := io.ReadAll(res.Body)
	if err != nil {
		return nil, fmt.Errorf("读取大模型响应失败: %w", err)
	}

	var resStruct LLMResponse
	if err = json.Unmarshal(b, &resStruct); err != nil {
		return nil, fmt.Errorf("解析大模型响应失败: %w", err)
	}

	if resStruct.Code == 7 { // 业务约定：7 表示模型生成失败
		return nil, fmt.Errorf("大模型生成失败: %s", resStruct.Msg)
	}

	return resStruct.Data, nil
}
