package anthropic

import (
	"encoding/json"
)

// MessagesRequest Anthropic Messages 请求
type MessagesRequest struct {
	Model                  string           `json:"model"`
	Messages               []Message        `json:"messages"`
	System                 any              `json:"system,omitempty"`
	MaxTokens              int              `json:"max_tokens"`
	Temperature            *float64         `json:"temperature,omitempty"`
	TopP                   *float64         `json:"top_p,omitempty"`
	TopK                   *int             `json:"top_k,omitempty"`
	StopSequences          []string         `json:"stop_sequences,omitempty"`
	Stream                 bool             `json:"stream,omitempty"`
	Tools                  []Tool           `json:"tools,omitempty"`
	ToolChoice             any              `json:"tool_choice,omitempty"`
	Metadata               *RequestMetadata `json:"metadata,omitempty"`
	Thinking               *ThinkingConfig  `json:"thinking,omitempty"`
	OutputConfig           *OutputConfig    `json:"output_config,omitempty"`
	DisableParallelToolUse *bool            `json:"disable_parallel_tool_use,omitempty"`
	Container              any              `json:"container,omitempty"`
}

// RequestMetadata 请求元数据
type RequestMetadata struct {
	UserID string `json:"user_id,omitempty"`
}

// ThinkingConfig 思考配置
type ThinkingConfig struct {
	Type         string `json:"type"`
	BudgetTokens *int   `json:"budget_tokens,omitempty"`
	Display      string `json:"display,omitempty"`
}

// OutputConfig 输出配置
type OutputConfig struct {
	Format *OutputFormatConfig `json:"format,omitempty"`
	Effort string              `json:"effort,omitempty"`
}

// OutputFormatConfig 输出格式配置
type OutputFormatConfig struct {
	Type   string          `json:"type"`
	Schema json.RawMessage `json:"schema,omitempty"`
}

// Message Anthropic 消息
type Message struct {
	Role    string `json:"role"`
	Content any    `json:"content"`
}

// TextContent 文本内容块
type TextContent struct {
	Type string `json:"type"`
	Text string `json:"text"`
}

// ToolUseContent 工具调用内容块
type ToolUseContent struct {
	Type  string          `json:"type"`
	ID    string          `json:"id"`
	Name  string          `json:"name"`
	Input json.RawMessage `json:"input"`
}

// ToolResultContent 工具结果内容块
type ToolResultContent struct {
	Type      string `json:"type"`
	ToolUseID string `json:"tool_use_id"`
	Content   any    `json:"content"`
	IsError   *bool  `json:"is_error,omitempty"`
}

// ThinkingContent 思考内容块
type ThinkingContent struct {
	Type     string `json:"type"`
	Thinking string `json:"thinking"`
}

// RedactedThinkingContent 已编辑思考内容块
type RedactedThinkingContent struct {
	Type string `json:"type"`
	Data string `json:"data"`
}

// Tool Anthropic 工具定义
type Tool struct {
	Name        string          `json:"name"`
	Description string          `json:"description,omitempty"`
	InputSchema json.RawMessage `json:"input_schema"`
}

// MessagesResponse Anthropic Messages 响应
type MessagesResponse struct {
	ID           string         `json:"id"`
	Type         string         `json:"type"`
	Role         string         `json:"role"`
	Model        string         `json:"model"`
	Content      []ContentBlock `json:"content"`
	StopReason   string         `json:"stop_reason"`
	StopSequence *string        `json:"stop_sequence,omitempty"`
	StopDetails  any            `json:"stop_details,omitempty"`
	Container    any            `json:"container,omitempty"`
	Usage        ResponseUsage  `json:"usage"`
}

// ContentBlock Anthropic 响应内容块
type ContentBlock struct {
	Type     string          `json:"type"`
	Text     string          `json:"text,omitempty"`
	ID       string          `json:"id,omitempty"`
	Name     string          `json:"name,omitempty"`
	Input    json.RawMessage `json:"input,omitempty"`
	Thinking string          `json:"thinking,omitempty"`
	Data     string          `json:"data,omitempty"`
}

// ResponseUsage 响应用量
type ResponseUsage struct {
	InputTokens              int  `json:"input_tokens"`
	OutputTokens             int  `json:"output_tokens"`
	CacheReadInputTokens     *int `json:"cache_read_input_tokens,omitempty"`
	CacheCreationInputTokens *int `json:"cache_creation_input_tokens,omitempty"`
}

// ModelsResponse Anthropic 模型列表响应
type ModelsResponse struct {
	Data    []ModelItem `json:"data"`
	HasMore bool        `json:"has_more"`
	FirstID *string     `json:"first_id,omitempty"`
	LastID  *string     `json:"last_id,omitempty"`
}

// ModelItem Anthropic 模型项
type ModelItem struct {
	ID          string `json:"id"`
	Type        string `json:"type"`
	DisplayName string `json:"display_name,omitempty"`
	CreatedAt   string `json:"created_at,omitempty"`
}

// ModelInfoResponse Anthropic 模型详情响应
type ModelInfoResponse struct {
	ID          string `json:"id"`
	Type        string `json:"type"`
	DisplayName string `json:"display_name,omitempty"`
	CreatedAt   string `json:"created_at,omitempty"`
}

// EmbeddingRequest Anthropic 不支持嵌入，但定义类型用于接口兼容
type EmbeddingRequest struct{}

// EmbeddingResponse Anthropic 不支持嵌入
type EmbeddingResponse struct{}

// RerankRequest Anthropic 不支持重排序
type RerankRequest struct{}

// RerankResponse Anthropic 不支持重排序
type RerankResponse struct{}

// ErrorResponse Anthropic 错误响应
type ErrorResponse struct {
	Type  string      `json:"type"`
	Error ErrorDetail `json:"error"`
}

// ErrorDetail 错误详情
type ErrorDetail struct {
	Type    string `json:"type"`
	Message string `json:"message"`
}

// SSEEvent SSE 事件
type SSEEvent struct {
	EventType string
	Data      json.RawMessage
}
