using ChatApi.Data;
using ChatRAG.Contracts.VectorSearch;
using ChatRAG.Services.Contracts;
using ChatRAG.Services.ResponseService;
using ChatRAG.Services.TextServices;
using ChatRAG.Settings.ChatRAG.Configuration;
using Microsoft.Extensions.Options;
namespace ChatRAG.Services.SearchVectors
{
///
/// Factory principal que cria implementações baseadas na configuração
///
///
/// Factory principal que cria implementações baseadas na configuração
///
public class VectorDatabaseFactory : IVectorDatabaseFactory
{
private readonly VectorDatabaseSettings _settings;
private readonly IServiceProvider _serviceProvider;
private readonly ILogger _logger;
public VectorDatabaseFactory(
IOptions settings,
IServiceProvider serviceProvider,
ILogger logger)
{
_settings = settings.Value;
_serviceProvider = serviceProvider;
_logger = logger;
// Valida configurações na inicialização
ValidateSettings();
}
public string GetActiveProvider() => _settings.Provider;
public VectorDatabaseSettings GetSettings() => _settings;
public IVectorSearchService CreateVectorSearchService()
{
_logger.LogInformation("Criando VectorSearchService para provider: {Provider}", _settings.Provider);
return _settings.Provider.ToLower() switch
{
"qdrant" => GetService(),
"mongodb" => GetService(),
_ => throw new ArgumentException($"Provider de VectorSearch não suportado: {_settings.Provider}")
};
}
public ITextDataService CreateTextDataService()
{
_logger.LogInformation("Criando TextDataService para provider: {Provider}", _settings.Provider);
return _settings.Provider.ToLower() switch
{
// ✅ CORRIGIDO: Usa os namespaces corretos
"qdrant" => GetService(),
"mongodb" => GetService(), // Sua classe atual!
_ => throw new ArgumentException($"Provider de TextData não suportado: {_settings.Provider}")
};
}
public IResponseService CreateResponseService()
{
_logger.LogInformation("Criando ResponseService para provider: {Provider}", _settings.Provider);
return _settings.Provider.ToLower() switch
{
// ✅ CORRIGIDO: Usa os namespaces corretos
"qdrant" => GetService(),
"mongodb" => GetService(), // Sua classe atual!
_ => throw new ArgumentException($"Provider de Response não suportado: {_settings.Provider}")
};
}
// ========================================
// MÉTODOS AUXILIARES
// ========================================
private T GetService() where T : class
{
try
{
var service = _serviceProvider.GetRequiredService();
_logger.LogDebug("Serviço {ServiceType} criado com sucesso", typeof(T).Name);
return service;
}
catch (InvalidOperationException ex)
{
_logger.LogError(ex, "Erro ao criar serviço {ServiceType} para provider {Provider}",
typeof(T).Name, _settings.Provider);
throw new InvalidOperationException(
$"Serviço {typeof(T).Name} não está registrado para provider {_settings.Provider}. " +
$"Certifique-se de chamar services.Add{_settings.Provider}Provider() no DI.", ex);
}
}
private void ValidateSettings()
{
if (!_settings.IsValid())
{
var errors = _settings.GetValidationErrors();
var errorMessage = $"Configurações inválidas para VectorDatabase: {string.Join(", ", errors)}";
_logger.LogError(errorMessage);
throw new InvalidOperationException(errorMessage);
}
_logger.LogInformation("Configurações validadas com sucesso para provider: {Provider}", _settings.Provider);
}
}
}