using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ZKuP
{
    internal class MySqlConnectionChecker
    {
        public class ConnectionResult
        {
            public bool IsConnected { get; set; }
            public string Message { get; set; }
            public TimeSpan ResponseTime { get; set; }
            public Exception Exception { get; set; }
        }


        /// <summary>
        /// Überprüft die Verbindung zu einem MySQL Server asynchron
        /// </summary>
        /// <param name="connectionString">MySQL Connection String</param>
        /// <param name="timeoutSeconds">Timeout in Sekunden (Standard: 10)</param>
        /// <returns>Task mit ConnectionResult</returns>
        public static async Task<ConnectionResult> CheckConnectionAsync()
        {
            var result = new ConnectionResult();
            var startTime = DateTime.Now;

            try
            {
                using (var connection = new MySqlConnection(SQL.GetConnstr(true)))
                {
                    await connection.OpenAsync();

                    // Teste mit einer einfachen Abfrage
                    using (var command = new MySqlCommand("SELECT 1", connection))
                    {
                        var testResult = await command.ExecuteScalarAsync();

                        if (testResult != null && testResult.ToString() == "1")
                        {
                            result.IsConnected = true;
                            result.Message = "Verbindung erfolgreich hergestellt";
                        }
                        else
                        {
                            result.IsConnected = false;
                            result.Message = "Verbindung hergestellt, aber Testabfrage fehlgeschlagen";
                        }
                    }
                }
            }
            catch (MySqlException ex)
            {
                result.IsConnected = false;
                result.Exception = ex;
                result.Message = GetMySqlErrorMessage(ex);
            }
            catch (Exception ex)
            {
                result.IsConnected = false;
                result.Exception = ex;
                result.Message = $"Unerwarteter Fehler: {ex.Message}";
            }

            result.ResponseTime = DateTime.Now - startTime;
            return result;
        }



        /// <summary>
        /// Gibt eine benutzerfreundliche Fehlermeldung basierend auf MySQL-Fehlercodes zurück
        /// </summary>
        private static string GetMySqlErrorMessage(MySqlException ex)
        {
            switch (ex.Number)
            {
                case 0:
                    return "Verbindung zum MySQL-Server konnte nicht hergestellt werden. Überprüfen Sie die Serveradresse.";
                case 1042:
                    return "MySQL-Server ist nicht erreichbar. Überprüfen Sie die Netzwerkverbindung.";
                case 1045:
                    return "Zugriff verweigert. Überprüfen Sie Benutzername und Passwort.";
                case 1049:
                    return "Die angegebene Datenbank existiert nicht.";
                case 1130:
                    return "Host ist nicht berechtigt, sich mit dem MySQL-Server zu verbinden.";
                case 2003:
                    return "MySQL-Server ist nicht erreichbar oder läuft nicht.";
                default:
                    return $"MySQL-Fehler ({ex.Number}): {ex.Message}";
            }
        }



    }
}
