using AidA.Data;
using AidA.Data.Entities;
using AidA.Service.Anonymization;
using DevExpress.Xpf.Editors;
using System;
using System.Windows;

namespace AidA.View
{
    public static class MainController
    {
        private static string WindowsUserName { get; set; }
        private static string DatabaseUserName { get; set; }

        private static LoginWindow LoginWindow { get; set; }
        private static MainWindow MainWindow { get; set; }
        private static AnonymisierungslaufVorbereitenWindow AnonymisierungslaufVorbereitenWindow { get; set; }
        private static AnonymisierungslaufDetailWindow AnonymisierungslaufDetailWindow { get; set; }
        private static AnonymisierungsAusnahmenWindow AnonymisierungsAusnahmenWindow { get; set; }

        private static AnonymizationManager AnonymizationManager { get; set; }


        public static void Login(string databaseUserName, string password, LoginWindow loginWindow)
        {
            WindowsUserName = Environment.UserName;
            DatabaseUserName = databaseUserName;

            try
            {
                HibernateHelper.Connect(databaseUserName, password);

                LoginWindow = loginWindow;
                LoginWindow.Hide();

                MainWindow = new MainWindow();
                MainWindow.Show();
            }
            catch (Exception ex)
            {
                var text = "(Datenbank-) Login fehlgeschlagen.\n\n" +
                    ex.Message + "\n\n" +
                    "Bitte Zugangsdaten prüfen.";
                MessageBox.Show(text, "Datenbank-Login fehlgeschlagen.", MessageBoxButton.OK);
            }
        }

        public static void AnonymisierungslaufVorbereiten1()
        {
            AnonymisierungslaufVorbereitenWindow = new AnonymisierungslaufVorbereitenWindow();
            AnonymisierungslaufVorbereitenWindow.ShowDialog();
        }

        public static void AnonymisierungslaufVorbereiten2(int aufbewahrungsfrist, ProgressBarEdit vorbereitungProgressbar)
        {
            AnonymizationManager = new AnonymizationManager(WindowsUserName);
            Anonymisierungslauf anonymisierungslauf = AnonymizationManager.AnonymisierungslaufVorbereiten(aufbewahrungsfrist, vorbereitungProgressbar);

            AnonymisierungslaufVorbereitenWindow.Hide();
            vorbereitungProgressbar.Visibility = System.Windows.Visibility.Hidden;

            AnonymisierungslaufDetailWindow = new AnonymisierungslaufDetailWindow(anonymisierungslauf);
            AnonymisierungslaufDetailWindow.ShowDialog();
        }

        public static void AnonymisierungslaufDurchfuehren(Anonymisierungslauf anonymisierungslauf, ProgressBarEdit durchfuehrenProgressbar)
        {
            AnonymizationManager.AnonymisierungslaufDurchfuehren(anonymisierungslauf, durchfuehrenProgressbar);
        }

        public static void AnonymisierungslaufSpeichern(Anonymisierungslauf anonymisierungslauf)
        {
            AnonymizationManager.AnonymisierungslaufSpeichern(anonymisierungslauf);
        }

        public static void AnonymisierungsAusnahmenBearbeiten()
        {
            AnonymisierungsAusnahmenWindow = new AnonymisierungsAusnahmenWindow();
            AnonymisierungsAusnahmenWindow.ShowDialog();
        }

        public static void AnonymisierungsAusnahmeHinzufuegen(long antragsNummer)
        {
            if (AnonymizationManager is null)
            {
                AnonymizationManager = new AnonymizationManager(WindowsUserName);
            }
            AnonymizationManager.AnonymisierungsAusnahmeHinzufuegen(antragsNummer);
        }

        public static void AnonymisierungsAusnahmeLoeschen(Anonymisierungsausnahme anonymisierungsausnahme)
        {
            if (AnonymizationManager is null)
            {
                AnonymizationManager = new AnonymizationManager(WindowsUserName);
            }
            AnonymizationManager.AnonymisierungsAusnahmeLoeschen(anonymisierungsausnahme);
        }

        public static void DatenbankSichern()
        {
            String dbBackupVerzeichnis = Properties.Settings.Default.DbBackupVerzeichnis;
            var dateiname = dbBackupVerzeichnis + "AidA_DB_Backup_" + String.Format("{0:yyyyMMdd HHmm}", DateTime.Now) + ".bak";
            Database.DbSichern(dateiname);
        }

        public static void AnwendungSchliessen()
        {
            LoginWindow.Close();
            Application.Current.Shutdown();
        }
    }
}
