package ai

// ToolCall 表示 AI 发出的工具调用
type ToolCall struct {
	ID       string           `json:"id"`
	Type     string           `json:"type"` // "function"
	Function ToolCallFunction `json:"function"`
}

// ToolCallFunction 表示单次工具调用的函数信息
type ToolCallFunction struct {
	Name      string `json:"name"`
	Arguments string `json:"arguments"`
}

// ToolFunction 表示可使用的函数定义
type ToolFunction struct {
	Name        string `json:"name"`
	Description string `json:"description"`
	Parameters  any    `json:"parameters"` // JSON Schema definitions
}

// Tool 工具申明
type Tool struct {
	Type     string       `json:"type"` // "function"
	Function ToolFunction `json:"function"`
}

// Message 表示一条对话消息
type Message struct {
	Role             string     `json:"role"` // "system" | "user" | "assistant" | "tool"
	Content          string     `json:"content"`
	Images           []string   `json:"images,omitempty"`            // base64 encoded images with data:image/png;base64,... prefix
	ToolCallID       string     `json:"tool_call_id,omitempty"`      // 当 role 为 "tool" 时必须传递
	ToolCalls        []ToolCall `json:"tool_calls,omitempty"`        // 当 role 为 "assistant" 并试图调工具时传递
	ReasoningContent string     `json:"reasoning_content,omitempty"` // DeepSeek thinking mode 工具调用链路要求原样回传
}

// ChatRequest AI 对话请求
type ChatRequest struct {
	Messages    []Message `json:"messages"`
	Temperature float64   `json:"temperature"`
	MaxTokens   int       `json:"maxTokens"`
	Tools       []Tool    `json:"tools,omitempty"`
}

// ChatResponse AI 对话响应
type ChatResponse struct {
	Content          string     `json:"content"`
	ReasoningContent string     `json:"reasoning_content,omitempty"`
	TokensUsed       TokenUsage `json:"tokensUsed"`
	ToolCalls        []ToolCall `json:"tool_calls,omitempty"`
}

// TokenUsage token 用量统计
type TokenUsage struct {
	PromptTokens     int `json:"promptTokens"`
	CompletionTokens int `json:"completionTokens"`
	TotalTokens      int `json:"totalTokens"`
}

// StreamChunk 流式响应片段
type StreamChunk struct {
	Content          string     `json:"content"`
	Thinking         string     `json:"thinking,omitempty"`
	ReasoningContent string     `json:"reasoning_content,omitempty"`
	Done             bool       `json:"done"`
	Error            string     `json:"error,omitempty"`
	ToolCalls        []ToolCall `json:"tool_calls,omitempty"`
}

// ProviderConfig AI Provider 配置
type ProviderConfig struct {
	ID          string            `json:"id"`
	Type        string            `json:"type"` // openai | anthropic | gemini | custom
	Name        string            `json:"name"`
	APIKey      string            `json:"apiKey"`
	SecretRef   string            `json:"secretRef,omitempty"`
	HasSecret   bool              `json:"hasSecret,omitempty"`
	BaseURL     string            `json:"baseUrl"`
	Model       string            `json:"model"`
	Models      []string          `json:"models,omitempty"`
	APIFormat   string            `json:"apiFormat,omitempty"` // custom 专用: openai | anthropic | gemini | claude-cli
	Headers     map[string]string `json:"headers,omitempty"`
	MaxTokens   int               `json:"maxTokens"`
	Temperature float64           `json:"temperature"`
}

// UserPromptSettings 表示用户级自定义提示词配置
type UserPromptSettings struct {
	Global        string `json:"global"`
	Database      string `json:"database"`
	JVM           string `json:"jvm"`
	JVMDiagnostic string `json:"jvmDiagnostic"`
}

// MCPTransport 表示 MCP 服务的传输方式
type MCPTransport string

const (
	MCPTransportStdio MCPTransport = "stdio"
)

// MCPServerConfig 表示一个可配置的 MCP 服务
type MCPServerConfig struct {
	ID             string            `json:"id"`
	Name           string            `json:"name"`
	Transport      MCPTransport      `json:"transport"`
	Command        string            `json:"command"`
	Args           []string          `json:"args,omitempty"`
	Env            map[string]string `json:"env,omitempty"`
	Enabled        bool              `json:"enabled"`
	TimeoutSeconds int               `json:"timeoutSeconds"`
}

// MCPToolDescriptor 表示暴露给模型和前端的 MCP 工具描述
type MCPToolDescriptor struct {
	Alias        string         `json:"alias"`
	ServerID     string         `json:"serverId"`
	ServerName   string         `json:"serverName"`
	OriginalName string         `json:"originalName"`
	Title        string         `json:"title,omitempty"`
	Description  string         `json:"description,omitempty"`
	InputSchema  map[string]any `json:"inputSchema,omitempty"`
}

// MCPToolCallResult 表示一次 MCP 工具调用的结果
type MCPToolCallResult struct {
	Alias             string `json:"alias"`
	ServerID          string `json:"serverId"`
	ServerName        string `json:"serverName"`
	OriginalName      string `json:"originalName"`
	Title             string `json:"title,omitempty"`
	Content           string `json:"content"`
	StructuredContent any    `json:"structuredContent,omitempty"`
	IsError           bool   `json:"isError"`
}

// MCPClientInstallResult 表示安装 GoNavi 到外部 MCP 客户端配置文件的结果。
type MCPClientInstallResult struct {
	Success    bool     `json:"success"`
	Client     string   `json:"client,omitempty"`
	Message    string   `json:"message"`
	ConfigPath string   `json:"configPath,omitempty"`
	Command    string   `json:"command,omitempty"`
	Args       []string `json:"args,omitempty"`
}

// MCPClientInstallStatus 表示 GoNavi MCP 在外部客户端中的当前安装状态。
type MCPClientInstallStatus struct {
	Client         string   `json:"client"`
	DisplayName    string   `json:"displayName"`
	InstallMode    string   `json:"installMode,omitempty"`
	Installed      bool     `json:"installed"`
	MatchesCurrent bool     `json:"matchesCurrent"`
	ClientDetected bool     `json:"clientDetected"`
	ClientCommand  string   `json:"clientCommand,omitempty"`
	ClientPath     string   `json:"clientPath,omitempty"`
	Message        string   `json:"message"`
	ConfigPath     string   `json:"configPath,omitempty"`
	Command        string   `json:"command,omitempty"`
	Args           []string `json:"args,omitempty"`
}

// MCPHTTPServerOptions 表示从客户端启动 GoNavi Streamable HTTP MCP 的参数。
type MCPHTTPServerOptions struct {
	Addr       string `json:"addr,omitempty"`
	Path       string `json:"path,omitempty"`
	Token      string `json:"token,omitempty"`
	SchemaOnly bool   `json:"schemaOnly"`
}

// MCPHTTPServerStatus 表示客户端内置 HTTP MCP 服务运行状态。
type MCPHTTPServerStatus struct {
	Running             bool   `json:"running"`
	Addr                string `json:"addr"`
	Path                string `json:"path"`
	URL                 string `json:"url"`
	SchemaOnly          bool   `json:"schemaOnly"`
	Token               string `json:"token,omitempty"`
	AuthorizationHeader string `json:"authorizationHeader,omitempty"`
	StartedAt           int64  `json:"startedAt,omitempty"`
	Message             string `json:"message"`
}

// ClaudeCodeMCPInstallResult 兼容旧命名，便于平滑迁移到通用结果类型。
type ClaudeCodeMCPInstallResult = MCPClientInstallResult

// SkillScope 表示 Skill 的适用场景
type SkillScope string

const (
	SkillScopeGlobal        SkillScope = "global"
	SkillScopeDatabase      SkillScope = "database"
	SkillScopeJVM           SkillScope = "jvm"
	SkillScopeJVMDiagnostic SkillScope = "jvmDiagnostic"
)

// SkillConfig 表示一个可配置的 Skill
type SkillConfig struct {
	ID            string   `json:"id"`
	Name          string   `json:"name"`
	Description   string   `json:"description,omitempty"`
	SystemPrompt  string   `json:"systemPrompt"`
	Enabled       bool     `json:"enabled"`
	Scopes        []string `json:"scopes,omitempty"`
	RequiredTools []string `json:"requiredTools,omitempty"`
}

// SQLPermissionLevel AI SQL 执行权限级别
type SQLPermissionLevel string

const (
	PermissionReadOnly  SQLPermissionLevel = "readonly"
	PermissionReadWrite SQLPermissionLevel = "readwrite"
	PermissionFull      SQLPermissionLevel = "full"
)

// ContextLevel AI 上下文传递级别
type ContextLevel string

const (
	ContextSchemaOnly  ContextLevel = "schema_only"
	ContextWithSamples ContextLevel = "with_samples"
	ContextWithResults ContextLevel = "with_results"
)

// SQLOperationType SQL 操作类型
type SQLOperationType string

const (
	SQLOpQuery SQLOperationType = "query" // SELECT, SHOW, DESCRIBE, EXPLAIN
	SQLOpDML   SQLOperationType = "dml"   // INSERT, UPDATE, DELETE
	SQLOpDDL   SQLOperationType = "ddl"   // CREATE, ALTER, DROP, TRUNCATE
	SQLOpOther SQLOperationType = "other"
)

// SafetyResult 安全检查结果
type SafetyResult struct {
	Allowed         bool             `json:"allowed"`
	OperationType   SQLOperationType `json:"operationType"`
	RequiresConfirm bool             `json:"requiresConfirm"`
	WarningMessage  string           `json:"warningMessage,omitempty"`
}
