package agent

import (
	"context"
	"strings"
	"time"

	"fiko-ai/internal/llm"
)

// ClaimCaptureTimeout bir turdan claim yakalamanın (kimlik doğrulama + kuyruğa alma) üst süresidir.
// Asıl yazma (LLM + embedding) claim servisinin kendi arka plan işinde, kendi süre sınırıyla yürür.
const ClaimCaptureTimeout = 15 * time.Second

// ClaimRequest tamamlanmış bir turdan Iddia Hafızası yakalama isteğidir.
type ClaimRequest struct {
	// UserID ağ katmanından gelen kimliktir; GÜVENİLMEZ: yazıcı bunu hesap dizininde doğrular.
	UserID         string
	ConversationID string
	// Text kullanıcının mesajıdır. Asistanın cevabı KASTEN verilmez (uydurma bilgi kayda girmesin).
	Text    string
	Model   string
	Options llm.Options
}

// ClaimWriter bir kullanıcı mesajındaki bilgileri ekip ortak hafızasına yazar.
//
// Sözleşme: HATA DÖNMEZ ve BEKLETMEZ. Kimlik doğrulanamazsa (üyelik kapalı, hesap yok…) sessizce
// hiçbir şey yazmaz; sohbet hiçbir koşulda bozulmaz. Ajan claim paketini bilmez (MemoryLearner ile
// aynı desen).
type ClaimWriter interface {
	Capture(ctx context.Context, req ClaimRequest)
}

// SetClaims Iddia Hafızası yazıcısını bağlar; nil ise yakalama kapalıdır. Sunucu istek almadan
// önce çağrılmalıdır.
func (a *Agent) SetClaims(w ClaimWriter) { a.claims = w }

// captureClaims tamamlanmış bir turdan ARKA PLANDA claim yakalar. Çağıran turu BEKLETMEZ.
// Ajan kapanırken (Close) iptal edilir ve bitmesi beklenir (learn ile aynı yaşam döngüsü).
func (a *Agent) captureClaims(in Input, text, model string, opts llm.Options) {
	if a.claims == nil || a.bg == nil || strings.TrimSpace(text) == "" {
		return
	}
	req := ClaimRequest{
		UserID: in.UserID, ConversationID: in.ConversationID, Text: text, Model: model, Options: opts,
	}
	a.wg.Add(1)
	go func() {
		defer a.wg.Done()
		defer func() {
			if r := recover(); r != nil {
				a.log.Error("claim yakalama çöktü", "panic", r, "conversation", in.ConversationID)
			}
		}()
		cctx, cancel := context.WithTimeout(a.bg, ClaimCaptureTimeout)
		defer cancel()
		a.claims.Capture(cctx, req)
	}()
}
