package models

import "time"

// Session 会话。
type Session struct {
	ID        string        `json:"session_id"`
	UserID    string        `json:"user_id,omitempty"`
	Title     string        `json:"title"`
	CreatedAt time.Time     `json:"created_at"`
	UpdatedAt time.Time     `json:"updated_at"`
	Config    SessionConfig `json:"config"`
}

// SessionConfig 会话配置。
type SessionConfig struct {
	TTSEnabled  bool   `json:"tts_enabled"`
	DetailLevel string `json:"detail_level"` // "low" | "high"
	Language    string `json:"language"`
	Scenario    string `json:"scenario"`     // 情景 ID，如 "free_chat"、"interviewer"
}

// DefaultSessionTitle 默认会话标题。
const DefaultSessionTitle = "新对话"

// DefaultConfig 默认会话配置。
func DefaultConfig() SessionConfig {
	return SessionConfig{TTSEnabled: true, DetailLevel: "low", Language: "zh-CN", Scenario: "free_chat"}
}

// SessionConfigPatch 会话配置增量更新（指针字段表示"未传则不更新"）。
type SessionConfigPatch struct {
	TTSEnabled  *bool   `json:"tts_enabled,omitempty"`
	DetailLevel *string `json:"detail_level,omitempty"`
	Language    *string `json:"language,omitempty"`
	Scenario    *string `json:"scenario,omitempty"`
}

// Apply 将 patch 中的非 nil 字段覆盖到 cfg。
func (p SessionConfigPatch) Apply(cfg *SessionConfig) {
	if p.TTSEnabled != nil {
		cfg.TTSEnabled = *p.TTSEnabled
	}
	if p.DetailLevel != nil {
		cfg.DetailLevel = *p.DetailLevel
	}
	if p.Language != nil {
		cfg.Language = *p.Language
	}
	if p.Scenario != nil {
		cfg.Scenario = *p.Scenario
	}
}

// User 用户。
type User struct {
	ID           string    `json:"id"`
	Username     string    `json:"username"`
	PasswordHash string    `json:"-"`
	CreatedAt    time.Time `json:"created_at"`
	UpdatedAt    time.Time `json:"updated_at"`
}

// Message 对话消息。
type Message struct {
	Role    string `json:"role"` // "user" | "assistant"
	Content string `json:"content"`
}

// --- WebSocket 消息 ---

// WsQuery 客户端 query 消息。
type WsQuery struct {
	Type      string `json:"type"`
	RequestID string `json:"request_id"`
	Image     string `json:"image"`     // base64
	Audio     string `json:"audio"`     // base64
	Text      string `json:"text"`      // 用户手动输入的文本（有值时跳过 STT）
	MimeType  string `json:"mime_type"` // 默认 "audio/pcm"
}

// WsConfig 客户端 config 消息。
type WsConfig struct {
	Type    string `json:"type"`
	Payload struct {
		TTSEnabled  *bool   `json:"tts_enabled,omitempty"`
		DetailLevel *string `json:"detail_level,omitempty"`
		Language    *string `json:"language,omitempty"`
		Scenario    *string `json:"scenario,omitempty"`
	} `json:"payload"`
}

// WsConnected 服务端 connected 消息。
type WsConnected struct {
	Type          string `json:"type"`
	SessionID     string `json:"session_id"`
	ServerVersion string `json:"server_version"`
}

// WsSTTResult 服务端 stt_result 消息。
type WsSTTResult struct {
	Type      string `json:"type"`
	RequestID string `json:"request_id"`
	Text      string `json:"text"`
	IsFinal   bool   `json:"is_final"`
}

// WsLLMChunk 服务端 llm_chunk 消息。
type WsLLMChunk struct {
	Type      string `json:"type"`
	RequestID string `json:"request_id"`
	Delta     string `json:"delta"`
	Role      string `json:"role"`
}

// WsLLMDone 服务端 llm_done 消息。
type WsLLMDone struct {
	Type       string `json:"type"`
	RequestID  string `json:"request_id"`
	FullText   string `json:"full_text"`
	TokensUsed struct {
		Prompt     int `json:"prompt"`
		Completion int `json:"completion"`
		Total      int `json:"total"`
	} `json:"tokens_used"`
	Model     string `json:"model"`
	LatencyMs int64  `json:"latency_ms"`
}

// WsTTSAudio 服务端 tts_audio 消息。
type WsTTSAudio struct {
	Type      string `json:"type"`
	RequestID string `json:"request_id"`
	Audio     string `json:"audio"`     // base64
	MimeType  string `json:"mime_type"` // "audio/mp3" 或 "audio/pcm"
	IsLast    bool   `json:"is_last"`   // 当前句子的音频是否完整（每句结束时为 true）
	Final     bool   `json:"final"`     // 整轮 TTS 是否结束（所有句子合成完毕后为 true）
}

// WsError 服务端 error 消息。
type WsError struct {
	Type      string `json:"type"`
	RequestID string `json:"request_id,omitempty"`
	Code      string `json:"code"`
	Message   string `json:"message"`
}

// WsPong 服务端 pong 消息。
type WsPong struct {
	Type string `json:"type"`
}
