private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            var databaseType = (DatabaseType)Enum.Parse(typeof(DatabaseType), ConfigurationManager.AppSettings["DatabaseType"]);

            radMSAccess.IsChecked   = databaseType == DatabaseType.File;
            radPostgreSQL.IsChecked = databaseType == DatabaseType.Server;

            if (databaseType == DatabaseType.Unknown)
            {
                bdrMessage.Visibility = Visibility.Visible;
            }

            if (radPostgreSQL.IsChecked == true)
            {
                bdrMessage.Visibility = Visibility.Collapsed;

                try
                {
                    using (var context = new PostgreSQL.Model.StudentElectionContext())
                    {
                        var connectionString = context.Database.Connection.ConnectionString;
                        if (connectionString.Contains("Port="))
                        {
                            txtPort.Text = connectionString.Split(';')
                                           .First(s => s.Contains("Port="))
                                           .Split('=')[1];
                        }
                        if (connectionString.Contains("Host="))
                        {
                            txtIPAddress.Text = connectionString.Split(';')
                                                .First(s => s.Contains("Host="))
                                                .Split('=')[1];
                        }
                        if (connectionString.Contains("Database="))
                        {
                            txtDatabaseName.Text = connectionString.Split(';')
                                                   .First(s => s.Contains("Database="))
                                                   .Split('=')[1];
                        }
                        if (connectionString.Contains("Username="******"Username="******"Unable to load the connection string", "Connection string error", MessageBoxButton.OK, MessageBoxImage.Error);
                }

                txtNetworkFolderAddress.Text = Properties.Network.Default.NetworkFolderAddress;
                txtNetworkFolderName.Text    = Properties.Network.Default.NetworkFolderName;
            }
        }
        private async void BtnConnect_Click(object sender, RoutedEventArgs e)
        {
            var configFile   = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            var userSettings = (UserSettingsGroup)configFile.GetSectionGroup("userSettings");

            if (radMSAccess.IsChecked == true)
            {
                if (!IsMdbFileExisting())
                {
                    MessageBox.Show($"'{ App.MdbFileName }' file does not exist in\n{ App.ExeDirectory }", "Connection error", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                configFile.AppSettings.Settings.Remove("DatabaseType");
                configFile.AppSettings.Settings.Add("DatabaseType", DatabaseType.File.ToString());

                Properties.Network.Default.NetworkFolderAddress = string.Empty;
                Properties.Network.Default.NetworkFolderName    = string.Empty;

                SetRepositories(configFile, MSAccessDatabaseName);

                configFile.Save(ConfigurationSaveMode.Modified);
                ConfigurationManager.RefreshSection(configFile.ConnectionStrings.SectionInformation.Name);
                ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);

                Properties.Network.Default.Save();

                MessageBox.Show("Successfully connected to the MS Access database :D\n\nThe program will now restart.", "Connection success", MessageBoxButton.OK, MessageBoxImage.Information);

                RestartSystem();

                this.DialogResult = true;
            }
            else if (radPostgreSQL.IsChecked == true)
            {
                int    port = 0;
                string host = string.Empty;
                string networkFolderName = txtNetworkFolderName.Text;

                if (!string.IsNullOrWhiteSpace(txtPort.Text) && !int.TryParse(txtPort.Text, out port))
                {
                    MessageBox.Show("Invalid port number", "Connection error", MessageBoxButton.OK, MessageBoxImage.Error);
                    txtPort.Focus();
                    return;
                }

                if (!string.IsNullOrWhiteSpace(txtIPAddress.Text) && IsLocalIpAddress(txtIPAddress.Text))
                {
                    host = txtIPAddress.Text;
                }
                else if (IPAddress.TryParse(txtIPAddress.Text, out var ipAddress))
                {
                    host = ipAddress.ToString();
                }
                else
                {
                    MessageBox.Show("Invalid host", "Connection error", MessageBoxButton.OK, MessageBoxImage.Error);
                    txtIPAddress.Focus();
                    return;
                }

                if (string.IsNullOrWhiteSpace(txtNetworkFolderAddress.Text))
                {
                    MessageBox.Show("Enter the network folder address", "Connection error", MessageBoxButton.OK, MessageBoxImage.Error);
                    txtNetworkFolderAddress.Focus();
                    return;
                }

                if (string.IsNullOrWhiteSpace(networkFolderName))
                {
                    MessageBox.Show("Enter the network folder name", "Connection error", MessageBoxButton.OK, MessageBoxImage.Error);
                    txtNetworkFolderName.Focus();
                    return;
                }

                if (!Directory.Exists($"{ txtNetworkLocation.Text }"))
                {
                    MessageBox.Show($"Network location '{ txtNetworkLocation.Text }' does not exist", "Connection error", MessageBoxButton.OK, MessageBoxImage.Error);
                    txtNetworkFolderAddress.Focus();
                    return;
                }

                string database = txtDatabaseName.Text;
                string userName = txtUserName.Text;
                string password = pwdServer.Password;

                var connectionStringBuilder = new StringBuilder();
                if (port != 0)
                {
                    connectionStringBuilder.Append($"Port={ port };");
                }
                connectionStringBuilder.Append($"Host={ host };");
                connectionStringBuilder.Append($"Database={ database };");
                connectionStringBuilder.Append($"Username={ userName };");
                connectionStringBuilder.Append($"Password={ password };");

                string connectionString = connectionStringBuilder.ToString();

                try
                {
                    G.WaitLang(this);

                    using (var context = new PostgreSQL.Model.StudentElectionContext())
                    {
                        context.Database.Connection.ConnectionString = connectionString;

                        await context.Database.Connection.OpenAsync();

                        if (context.Database.Connection.State == System.Data.ConnectionState.Open)
                        {
                            context.Database.Connection.Close();
                        }
                        else
                        {
                            throw new NpgsqlException("Cannot open database");
                        }
                    }

                    configFile.AppSettings.Settings.Remove("DatabaseType");
                    configFile.AppSettings.Settings.Add("DatabaseType", DatabaseType.Server.ToString());

                    Properties.Network.Default.NetworkFolderAddress = host;
                    Properties.Network.Default.NetworkFolderName    = networkFolderName;

                    configFile.ConnectionStrings
                    .ConnectionStrings["StudentElectionContext"]
                    .ConnectionString = $"metadata=res://*/Model.StudentElectionContext.csdl|res://*/Model.StudentElectionContext.ssdl|res://*/Model.StudentElectionContext.msl;" +
                                        $"provider=Npgsql;" +
                                        $"provider connection string=\"{ connectionString }\"";

                    SetRepositories(configFile, PostgreSQLDatabaseName);

                    configFile.Save(ConfigurationSaveMode.Modified);
                    ConfigurationManager.RefreshSection(configFile.ConnectionStrings.SectionInformation.Name);
                    ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);

                    Properties.Network.Default.Save();

                    G.EndWait(this);

                    MessageBox.Show("Successfully connected to a PostgreSQL database :D\n\nThe program will now restart.", "Connection success", MessageBoxButton.OK, MessageBoxImage.Information);

                    RestartSystem();

                    this.DialogResult = true;
                }
                catch (Exception ex)
                {
                    Logger.LogError(ex);

                    G.EndWait(this);

                    MessageBox.Show(ex.GetBaseException().Message, "Connection error", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
            else
            {
                MessageBox.Show("Select a database to use", "No selected database", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }