using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using DataConnection.Interfaces; using DataConnection.EF; using DataConnection.EF.DatabaseDiscovery; using DataConnection.Enums; namespace Data_Coupler.Data { public class DatabaseConnectionService { private readonly IDatabaseDiscovery _sqlServerDiscovery; private readonly IDatabaseDiscovery _mySqlDiscovery; public DatabaseType SelectedDatabaseType { get; set; } = DatabaseType.SqlServer; public string ConnectionString { get; set; } public List AvailableDatabases { get; private set; } = new List(); public Dictionary DatabasesInfo { get; private set; } = new Dictionary(); public string SelectedDatabase { get; set; } public bool IsConnected { get; private set; } public string ErrorMessage { get; private set; } public DatabaseConnectionService() { _sqlServerDiscovery = new SqlServerDatabaseDiscovery(); // Se in futuro verrĂ  implementata la discovery MySQL, potremmo aggiungerla qui // _mySqlDiscovery = new MySqlDatabaseDiscovery(); } public IDatabaseDiscovery GetDatabaseDiscovery() { return SelectedDatabaseType switch { DatabaseType.SqlServer => _sqlServerDiscovery, // DatabaseType.MySql => _mySqlDiscovery, _ => throw new NotSupportedException($"Tipo di database non supportato: {SelectedDatabaseType}") }; } public async Task TestConnectionAsync() { try { var discovery = GetDatabaseDiscovery(); AvailableDatabases = await discovery.GetAvailableDatabasesAsync(ConnectionString, true); IsConnected = AvailableDatabases.Any(); ErrorMessage = IsConnected ? null : "Nessun database trovato sul server."; return IsConnected; } catch (Exception ex) { IsConnected = false; ErrorMessage = $"Errore di connessione: {ex.Message}"; if (ex.InnerException != null) { ErrorMessage += $" - {ex.InnerException.Message}"; } return false; } } public async Task> GetDatabasesInfoAsync() { try { var discovery = GetDatabaseDiscovery(); DatabasesInfo = await discovery.GetDatabasesInfoAsync(ConnectionString, false); return DatabasesInfo; } catch (Exception ex) { ErrorMessage = $"Errore nel recupero delle informazioni: {ex.Message}"; return new Dictionary(); } } public string BuildConnectionStringWithDatabase() { if (string.IsNullOrEmpty(SelectedDatabase)) return ConnectionString; // Per SQL Server if (SelectedDatabaseType == DatabaseType.SqlServer) { if (ConnectionString.Contains("Initial Catalog=") || ConnectionString.Contains("Database=")) { // Sostituisci il database esistente var modifiedString = System.Text.RegularExpressions.Regex.Replace( ConnectionString, @"(Initial Catalog|Database)=([^;]*)", $"$1={SelectedDatabase}"); return modifiedString; } else { // Aggiungi il database return ConnectionString + $";Database={SelectedDatabase}"; } } // Per altri tipi di database, implementare la logica appropriata return ConnectionString; } } }