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); } } }