// Package conversation konuşma alan modelini, depo arayüzünü ve iş kurallarını içerir.
package conversation

import "time"

type Role string

const (
	RoleSystem    Role = "system"
	RoleUser      Role = "user"
	RoleAssistant Role = "assistant"
)

type MessageStatus string

const (
	StatusComplete    MessageStatus = "complete"
	StatusInterrupted MessageStatus = "interrupted"
	StatusError       MessageStatus = "error"
)

// DefaultTitle ilk kullanıcı mesajına kadar kullanılan başlıktır.
const DefaultTitle = "Yeni konuşma"

// Conversation salt bir mesaj listesi değil, bağlam taşıyan bir oturumdur.
// Mesajlar ayrı koleksiyonda tutulur (messages); bu alan yalnızca API yanıtlarında doldurulur.
// Skill/Tool/Context alanları ilk günden şemada yer alır ki sonraki fazlarda migrasyon gerekmesin.
type Conversation struct {
	ID              string            `bson:"_id" json:"id"`
	UserID          string            `bson:"userId" json:"userId"`
	SessionID       string            `bson:"sessionId" json:"sessionId"`
	Title           string            `bson:"title" json:"title"`
	ActiveContext   map[string]any    `bson:"activeContext,omitempty" json:"activeContext,omitempty"`
	ActiveSkill     string            `bson:"activeSkill,omitempty" json:"activeSkill,omitempty"`
	ActiveTool      string            `bson:"activeTool,omitempty" json:"activeTool,omitempty"`
	CurrentDocument string            `bson:"currentDocument,omitempty" json:"currentDocument,omitempty"`
	SelectedObject  string            `bson:"selectedObject,omitempty" json:"selectedObject,omitempty"`
	WorkingMemory   map[string]any    `bson:"workingMemory,omitempty" json:"workingMemory,omitempty"`
	Metadata        map[string]string `bson:"metadata,omitempty" json:"metadata,omitempty"`
	CreatedAt       time.Time         `bson:"createdAt" json:"createdAt"`
	UpdatedAt       time.Time         `bson:"updatedAt" json:"updatedAt"`
	Messages        []Message         `bson:"-" json:"messages,omitempty"`
}

// ToolRun bir tool çağrısının KALICI kaydıdır (Phase 5 "execution tracking").
//
// Neden ayrı mesaj değil de asistan mesajının alanı?
//   - Konuşma geçmişi "rol → içerik" zinciridir; yeni bir rol eklemek bağlam kurma,
//     listeleme ve sayaç davranışlarını değiştirirdi.
//   - Tool çalıştırmaları bir cevabın ÜSTÜNE aittir: "bu cevapta şunlar çalıştı".
//
// Arayüz, yeniden bağlanıldığında da bu kayıtları gösterir (canlı rozetler kaybolur).
//
// Input/Output yalnızca GÖRÜNTÜ amaçlıdır ve boyutu sınırlıdır (bkz. agent.ToolPreview);
// istemci gösterir, modele geri beslenmez.
type ToolRun struct {
	CallID     string         `bson:"callId" json:"callId"`
	Name       string         `bson:"name" json:"name"`
	Status     string         `bson:"status" json:"status"` // success | error
	Error      string         `bson:"error,omitempty" json:"error,omitempty"`
	DurationMs int64          `bson:"durationMs" json:"durationMs"`
	Input      map[string]any `bson:"input,omitempty" json:"input,omitempty"`
	Output     map[string]any `bson:"output,omitempty" json:"output,omitempty"`
	// UI çıktının arayüz görünümüdür. Sayfa yenilendiğinde de aynı bileşen seçilsin
	// diye canlı olaydaki karar KALICI kayda da yazılır (aksi hâlde geçmiş yanlış görünür).
	UI string `bson:"ui,omitempty" json:"ui,omitempty"`
}

// Onay/bilgi formu kartının durumları. Kart cevaplandıktan sonra da mesajın altında kalır;
// sayfa yenilendiğinde hangi durumda olduğu buradan okunur.
const (
	ConfirmPending   = "pending"   // kullanıcı henüz cevaplamadı
	ConfirmAnswered  = "answered"  // onaylandı (araç çalıştı / form cevapları gönderildi)
	ConfirmCancelled = "cancelled" // vazgeçildi ya da işlem yapılamadı
	ConfirmExpired   = "expired"   // süresi doldu ya da sunucu formu artık tanımıyor
)

// ToolConfirmField onay formundaki tek bir alandır (protocol.ToolConfirmField ile aynı JSON biçimi).
//
// Alan modeli burada ayrıca tanımlıdır: konuşma paketi taşıma katmanına (protocol) bağımlı olmasın.
type ToolConfirmField struct {
	Key      string   `bson:"key" json:"key"`
	Label    string   `bson:"label" json:"label"`
	Value    string   `bson:"value" json:"value"`
	Editable bool     `bson:"editable" json:"editable"`
	Required bool     `bson:"required" json:"required"`
	Missing  bool     `bson:"missing" json:"missing"`
	Hint     string   `bson:"hint,omitempty" json:"hint,omitempty"`
	Options  []string `bson:"options,omitempty" json:"options,omitempty"`
	Type     string   `bson:"type,omitempty" json:"type,omitempty"`
}

// ToolConfirm bir onay/bilgi formunun KALICI kaydıdır.
//
// Neden kalıcı? Form yalnızca üretildiği an `tool.confirm` WS olayıyla gidiyordu; sayfa
// yenilenince olay kaçıyor ve kart sonsuza dek kayboluyordu. Kayıt asistan mesajıyla birlikte
// saklanır (ToolRuns ile aynı desen); cevaplanınca State/Summary/Values güncellenir.
//
// Araç girdisi (toolInput) BİLEREK saklanmaz: yalnızca sunucu belleğindeki bekleyen formda
// durur. Sunucu yeniden başlarsa form zaten geçersizdir ve kart "expired" olur.
type ToolConfirm struct {
	ConfirmID     string             `bson:"confirmId" json:"confirmId"`
	CallID        string             `bson:"callId,omitempty" json:"callId,omitempty"`
	Tool          string             `bson:"tool" json:"tool"`
	Action        string             `bson:"action" json:"action"`
	Title         string             `bson:"title" json:"title"`
	Message       string             `bson:"message,omitempty" json:"message,omitempty"`
	Fields        []ToolConfirmField `bson:"fields" json:"fields"`
	MissingFields []string           `bson:"missingFields,omitempty" json:"missingFields,omitempty"`
	ConfirmLabel  string             `bson:"confirmLabel" json:"confirmLabel"`
	CancelLabel   string             `bson:"cancelLabel" json:"cancelLabel"`
	Destructive   bool               `bson:"destructive" json:"destructive"`

	State   string            `bson:"state" json:"state"` // pending | answered | cancelled | expired
	Summary string            `bson:"summary,omitempty" json:"summary,omitempty"`
	Values  map[string]string `bson:"values,omitempty" json:"values,omitempty"` // bilgi formunun nihai cevapları

	CreatedAt  time.Time  `bson:"createdAt" json:"createdAt"`
	ResolvedAt *time.Time `bson:"resolvedAt,omitempty" json:"resolvedAt,omitempty"`
}

// ToolConfirmResolution bekleyen bir kartın nasıl kapandığını anlatır.
type ToolConfirmResolution struct {
	State   string // answered | cancelled | expired
	Summary string
	Values  map[string]string
}

type Message struct {
	ID               string        `bson:"_id" json:"id"`
	ConversationID   string        `bson:"conversationId" json:"conversationId"`
	Role             Role          `bson:"role" json:"role"`
	Content          string        `bson:"content" json:"content"`
	Status           MessageStatus `bson:"status" json:"status"`
	Model            string        `bson:"model,omitempty" json:"model,omitempty"`
	PromptTokens     int           `bson:"promptTokens,omitempty" json:"promptTokens,omitempty"`
	CompletionTokens int           `bson:"completionTokens,omitempty" json:"completionTokens,omitempty"`
	LatencyMs        int64         `bson:"latencyMs,omitempty" json:"latencyMs,omitempty"`
	// ToolRuns bu cevabı üretirken çalışan tool'ların kaydıdır (asistan mesajlarında).
	ToolRuns []ToolRun `bson:"toolRuns,omitempty" json:"toolRuns,omitempty"`
	// ToolConfirms bu cevabın doğurduğu onay/bilgi formu kartlarıdır (birden çok olabilir).
	// Cevaplandıktan sonra da kalır; sayfa yenilenince kartlar buradan geri gelir.
	ToolConfirms []ToolConfirm `bson:"toolConfirms,omitempty" json:"toolConfirms,omitempty"`
	CreatedAt    time.Time     `bson:"createdAt" json:"createdAt"`
}
