using ChatRAG.Models;
using Microsoft.Extensions.VectorData;
namespace ChatRAG.Contracts.VectorSearch
{
///
/// Interface unificada para operações de busca vetorial.
/// Pode ser implementada por MongoDB, Qdrant, Pinecone, etc.
///
public interface IVectorSearchService
{
// ========================================
// BUSCA VETORIAL
// ========================================
///
/// Busca documentos similares usando embedding vetorial
///
/// Embedding da query (ex: 1536 dimensões para OpenAI)
/// Filtrar por projeto específico (opcional)
/// Score mínimo de similaridade (0.0 a 1.0)
/// Número máximo de resultados
/// Filtros adicionais (metadata, data, etc.)
/// Lista de documentos ordenados por similaridade
Task> SearchSimilarAsync(
double[] queryEmbedding,
string? projectId = null,
double threshold = 0.3,
int limit = 5,
Dictionary? filters = null);
///
/// Busca adaptativa - relaxa threshold se não encontrar resultados suficientes
/// (Implementa a mesma lógica do seu ResponseRAGService atual)
///
/// Embedding da query
/// ID do projeto
/// Threshold inicial (será reduzido se necessário)
/// Número máximo de resultados
/// Lista de documentos com busca adaptativa
Task> SearchSimilarDynamicAsync(
double[] queryEmbedding,
string projectId,
double minThreshold = 0.5,
int limit = 5);
// ========================================
// CRUD DE DOCUMENTOS
// ========================================
///
/// Adiciona um novo documento com embedding
///
/// Título do documento
/// Conteúdo do documento
/// ID do projeto
/// Embedding pré-calculado
/// Metadados adicionais (tags, data, autor, etc.)
/// ID do documento criado
Task AddDocumentAsync(
string title,
string content,
string projectId,
double[] embedding,
Dictionary? metadata = null);
///
/// Atualiza um documento existente
///
/// ID do documento
/// Novo título
/// Novo conteúdo
/// ID do projeto
/// Novo embedding
/// Novos metadados
Task UpdateDocumentAsync(
string id,
string title,
string content,
string projectId,
double[] embedding,
Dictionary? metadata = null);
///
/// Remove um documento
///
/// ID do documento
Task DeleteDocumentAsync(string id);
// ========================================
// CONSULTAS AUXILIARES
// ========================================
///
/// Verifica se um documento existe
///
/// ID do documento
/// True se existe, False caso contrário
Task DocumentExistsAsync(string id);
///
/// Recupera um documento específico por ID
///
/// ID do documento
/// Documento ou null se não encontrado
Task GetDocumentAsync(string id);
///
/// Lista todos os documentos de um projeto
///
/// ID do projeto
/// Lista de documentos do projeto
Task> GetDocumentsByProjectAsync(string projectId);
///
/// Conta total de documentos
///
/// Filtrar por projeto (opcional)
/// Número de documentos
Task GetDocumentCountAsync(string? projectId = null);
// ========================================
// HEALTH CHECK E MÉTRICAS
// ========================================
///
/// Verifica se o serviço está saudável
///
/// True se está funcionando, False caso contrário
Task IsHealthyAsync();
///
/// Retorna estatísticas e métricas do provider
///
/// Dicionário com estatísticas (documentos, performance, etc.)
Task> GetStatsAsync();
}
}