package domain

import "context"

// Message represents a single message in the conversation
type Message struct {
	Role       string     `json:"role"`                 // "system", "user", "assistant", "tool"
	Content    string     `json:"content"`              // Message content
	ToolCallID string     `json:"tool_call_id,omitempty"` // For tool responses
	ToolCalls  []ToolCall `json:"tool_calls,omitempty"` // For assistant messages with function calls
}

// ToolCall represents a function call request from the LLM
type ToolCall struct {
	ID       string `json:"id"`
	Type     string `json:"type"` // "function"
	Function struct {
		Name      string `json:"name"`
		Arguments string `json:"arguments"` // JSON string
	} `json:"function"`
}

// Tool represents a function available to the LLM
type Tool struct {
	Type     string      `json:"type"` // "function"
	Function ToolFunction `json:"function"`
}

// ToolFunction defines a function that can be called
type ToolFunction struct {
	Name        string                 `json:"name"`
	Description string                 `json:"description"`
	Parameters  map[string]interface{} `json:"parameters"`
}

// LLMRequest represents a request to the LLM with conversation history
type LLMRequest struct {
	Messages []Message `json:"messages"`
	Tools    []Tool    `json:"tools,omitempty"`
}

// LLMResponse represents the response from the LLM
type LLMResponse struct {
	Content   string     `json:"content"`
	ToolCalls []ToolCall `json:"tool_calls,omitempty"`
}

// LLMProvider defines the interface for LLM providers
type LLMProvider interface {
	Complete(ctx context.Context, request LLMRequest) (*LLMResponse, error)
}
