package knowledge

import (
	"context"
	"errors"
)

// ErrVectorUnavailable depo vektör aramayı (MongoDB $vectorSearch) şu an sunamıyor demektir:
// mongot yok, index henüz hazır değil ya da kısa süre önce hata verdi. Hata DEĞİL, düşüş sinyalidir:
// Service bunu görünce aramayı Go tarafı skorlamasıyla (SearchableChunks) sürdürür.
var ErrVectorUnavailable = errors.New("knowledge: vektör arama kullanılamıyor")

// VectorQuery depo tarafı vektör aramasının girdisidir.
type VectorQuery struct {
	// Filter kullanıcı/proje/belge/etiket süzgecidir; UserID zorunludur (boşsa sonuç boştur).
	Filter ChunkFilter
	// Vector sorgu vektörüdür; boyutu depodaki index'in boyutuyla aynı olmalıdır.
	Vector []float32
	// Model yalnızca bu embedding modelinin vektörleri aranır (başka modelin vektörü farklı uzaydadır).
	Model string
	// Limit en çok kaç parça döneceği.
	Limit int
}

// VectorHit depo tarafı aramanın tek sonucudur. Chunk.Embedding DOLDURULMAZ (taşımaya değmez).
type VectorHit struct {
	Chunk Chunk
	// Similarity kosinüs benzerliğidir (0..1; negatif 0'a çekilir). Go tarafındaki cosine() ile
	// AYNI ölçektir: MinScore eşiği iki yolda aynı anlama gelir.
	Similarity float64
}

// VectorSearcher isteğe bağlı depo yeteneğidir (llm.ToolProvider / Embedder ile aynı desen):
// Repository arayüzüne EKLENMEZ; bellek içi depo uygulamaz ve çalışmaya devam eder.
//
// Neden ayrı? Skorlama Go'da yapılırken kullanıcının TÜM parçaları (embedding dahil) Mongo'dan
// çekilir; belge sayısı büyüdükçe bu doğrusal maliyettir. $vectorSearch skorlamayı veritabanına
// iter ve yalnızca en yakın adayları getirir.
type VectorSearcher interface {
	// VectorSearch en yakın parçaları benzerliğe göre azalan döndürür.
	// Kullanılamıyorsa ErrVectorUnavailable (ya da sarmalayan hata) döner.
	VectorSearch(ctx context.Context, q VectorQuery) ([]VectorHit, error)
	// UnembeddedChunks verilen modelin vektörünü TAŞIMAYAN (henüz işlenmemiş ya da bayat) parçaları
	// döndürür; hibrit aramada bunlar yalnızca anahtar kelimeyle bulunur. Embedding dahil değildir.
	UnembeddedChunks(ctx context.Context, f ChunkFilter, model string, limit int) ([]Chunk, error)
}

// VectorIndexer isteğe bağlı depo yeteneğidir: vektör index'ini verilen boyutla kurar/günceller ve
// sorgulanabilir olana kadar bekler. Boyut embedding modelinden öğrenilir (qwen3-embedding
// varyantlarına göre değişir), bu yüzden index şemada sabit değil, açılışta kurulur.
type VectorIndexer interface {
	PrepareVectorIndex(ctx context.Context, dims int) error
}
