package imports

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
)

// 修正后的文生图请求结构
type TextToImageRequest struct {
	Model  string                `json:"model"`
	Input  TextToImageInput      `json:"input"`
	Params TextToImageParameters `json:"parameters"` // 修正字段名
}

type TextToImageInput struct {
	Prompt         string `json:"prompt"`
	NegativePrompt string `json:"negative_prompt"`
}

type TextToImageParameters struct {
	Size           string  `json:"size,omitempty"`
	N              int     `json:"n,omitempty"`
	NegativePrompt string  `json:"negative_prompt,omitempty"`
	Steps          int     `json:"steps,omitempty"`
	Scale          float64 `json:"scale,omitempty"`
	Style          string  `json:"style,omitempty"`
	Seed           int     `json:"seed,omitempty"`
	Temperature    float64 `json:"temperature,omitempty"`
	TopP           float64 `json:"top_p,omitempty"`
}

type TextToImageResponse struct {
	Output struct {
		TaskID     string `json:"task_id"`
		TaskStatus string `json:"task_status"` // 添加任务状态字段
		Results    []struct {
			URL string `json:"url"`
		} `json:"results"`
	} `json:"output"`
	RequestID string `json:"request_id"`
	Code      string `json:"code,omitempty"`    // 错误代码
	Message   string `json:"message,omitempty"` // 错误信息
}

// 修正后的文生图函数
func (g *AiGenerator) TextToImage(prompt string, size string, n int) (*TextToImageResponse, error) {
	if g.cfg.APIKey == "" {
		return nil, fmt.Errorf("API密钥未配置")
	}

	// 构建请求
	req := TextToImageRequest{
		Model: g.cfg.TextToImageModel,
		Input: TextToImageInput{
			Prompt:         prompt,
			NegativePrompt: "低质量、残缺、人物正脸、多余的手指、乱码字符和文字、比例不良丶场景以国内场景为主",
			//NegativePrompt: "人物正脸",
		},
		Params: TextToImageParameters{
			Size:           size,
			N:              n,
			Seed:           generateSeed(),
			NegativePrompt: "低质量、残缺、人物正脸、多余的手指、乱码字符和文字、比例不良、场景以国内场景为主",
		},
	}

	url := g.cfg.BaseURL + g.cfg.TextToImageURL
	jsonData, err := json.Marshal(req)
	if err != nil {
		return nil, fmt.Errorf("JSON序列化失败: %v", err)
	}

	// 打印请求信息用于调试
	fmt.Printf("请求URL: %s\n", url)
	fmt.Printf("请求体: %s\n", string(jsonData))

	httpReq, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	if err != nil {
		return nil, fmt.Errorf("创建请求失败: %v", err)
	}

	httpReq.Header.Set("Content-Type", "application/json")
	httpReq.Header.Set("Authorization", "Bearer "+g.cfg.APIKey)
	httpReq.Header.Set("X-DashScope-Async", "enable")

	resp, err := g.client.Do(httpReq)
	if err != nil {
		return nil, fmt.Errorf("API请求失败: %v", err)
	}
	defer resp.Body.Close()

	// 读取完整响应体
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, fmt.Errorf("读取响应失败: %v", err)
	}

	fmt.Printf("响应状态: %d\n", resp.StatusCode)
	fmt.Printf("响应体: %s\n", string(body))

	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("API错误: %d, 响应: %s", resp.StatusCode, string(body))
	}

	// 解析响应
	var result TextToImageResponse
	if err := json.Unmarshal(body, &result); err != nil {
		return nil, fmt.Errorf("响应解析失败: %v, 原始响应: %s", err, string(body))
	}

	// 检查任务状态
	if result.Output.TaskStatus == "FAILED" {
		return nil, fmt.Errorf("图片生成失败: %s", result)
	}

	return &result, nil
}
