using FuzzySharp;
using MahApps.Metro.Controls;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.Remoting.Channels;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Threading;
using Windows.UI.Popups;
//using Windows.UI.Xaml.Controls.Primitives;
using static System.Net.Mime.MediaTypeNames;

namespace ZKuP
{
    /// <summary>
    /// Interaktionslogik für CreateFirma.xaml
    /// </summary>
    public partial class CreateFirma : MetroWindow, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        //private List<Firma> myVar;
        //public List<Firma> FirmaView
        //{
        //    get { return myVar; }
        //    set { myVar = value; }
        //}

        DataTable firmen = new DataTable("Firmen");
        private Dictionary<string, List<string>> firmenSearchList = new Dictionary<string, List<string>>();
        public object dg_cbBE_Tooltip { get; private set; }

        private List<string> aspVar;
        public List<string> asp
        {
            get { return aspVar; }
            set { aspVar = value; OnPropertyChanged(); }
        }

        private List<string> BEitems;
        public List<string> BEItems
        {
            get { return BEitems; }
            set { BEitems = value; OnPropertyChanged(); }
        }

        private bool beColumnIsEnabled = false;
        public bool BEColumnIsEnabled
        {
            get { return beColumnIsEnabled; }
            set { beColumnIsEnabled = value; OnPropertyChanged(); }
        }

        public string Personen { get; set; }
        public string TelNr { get; set; }


        System.Windows.Threading.DispatcherTimer searchTimer = new System.Windows.Threading.DispatcherTimer();

        DispatcherTimer existingFirmenTimer = new DispatcherTimer();
        DispatcherTimer popCloseTimer = new DispatcherTimer();
        Popup BEPopup = new Popup();

        public CreateFirma()
        {
            this.DataContext = this;

            InitializeComponent();

            updateList();

            Dispatcher.Invoke(() => dgFirmen.Columns.FirstOrDefault(c => c.Header.ToString() == "Name").SortDirection = ListSortDirection.Ascending);

            asp = SQL.ReadListString($"SELECT Name FROM {MainWindow.table}.ansprechpartner").Result;
            asp = asp.OrderBy(p => p).ToList();


            searchTimer.Interval = TimeSpan.FromSeconds(0.0005);
            searchTimer.Tick += SearchTimer_Tick;


            existingFirmenTimer.Tick += ExistingFirmenTimer_Tick;
            existingFirmenTimer.Interval = TimeSpan.FromMilliseconds(500);

            popCloseTimer.Interval = TimeSpan.FromSeconds(5);
            popCloseTimer.Tick += (s, arg) =>
                {
                    dgFirmen.FindChild<Grid>("grid_dgBE").MouseEnter -= cbBE_MouseEnter;
                    ccBE.MouseEnter -= cbBE_MouseEnter;

                    M2WithoutGebuchterBETooltipPopup.IsOpen = false;
                    M2WithGebuchterBETooltipPopup.IsOpen = false;
                    NotM2TooltipPopup.IsOpen = false;

                    dgFirmen.FindChild<Grid>("grid_dgBE").MouseEnter += cbBE_MouseEnter;
                    ccBE.MouseEnter += cbBE_MouseEnter;
                };


            cbAnsprechpartner_Intern.ItemsSource = asp;


            StackPanel sp = new StackPanel();
            sp.Children.Add(new TextBlock() { Text = "Die Begleitpersonen müssen nur augefüllt werden wenn die selbe Firma für die gleiche Aufgabe, aber an verschiedenen Orten eingeplant ist" });
            sp.Children.Add(new TextBlock());
            sp.Children.Add(new TextBlock());
            sp.Children.Add(new TextBlock() { Text = "Beispiel:" });
            sp.Children.Add(new TextBlock());
            sp.Children.Add(new TextBlock() { Text = "3 Mitarbeiter von Siemens sind für 3 verschiedene Loks vor Ort." });
            sp.Children.Add(new TextBlock() { Text = "Die MA von Siemens kommen zb. zu unterschiedlichen Zeiten" });

            ToolTip tt = new ToolTip();
            tt.Content = sp;
            tt.PlacementTarget = btnBegleiter;
            tt.Placement = PlacementMode.Right;
            //tt.IsOpen = true;            

            btnBegleiter.ToolTip = tt;

            ToolTipService.SetInitialShowDelay(btnBegleiter, 10);

            //var desc = Helper.GetBEDescription();
            //var numbers = Helper.GetBENumbers();
            //var be = new List<string>();
            //be.Add("");

            //for (int i = 0; i < numbers.Count; i++)
            //{
            //    be.Add($"BE-Fläche {numbers[i]} ({desc[i]})");
            //}

            if (MainWindow.LoggedInRole == Roles.M2 || MainWindow.LoggedInRole == Roles.M2_AM || MainWindow.LoggedInRole == Roles.Admin)
            {
                LoadBEs();

            }
            else
            {
                cbBE.IsEnabled = false;
                cbBE.ToolTip = "BE-Flächen können nur von M2 gebucht werden";

                dg_cbBE_Tooltip = "BE-Flächen können nur von M2 gebucht werden";
                ToolTipService.SetInitialShowDelay(cbBE, 100);
                ToolTipService.SetShowOnDisabled(cbBE, true);
            }

            dpEinweisung_Bis.DisplayDateEnd = DateTime.Now + TimeSpan.FromDays(365);
        }

        private void LoadBEs()
        {
            var be = new List<string>();
            if (MainWindow.LoggedInRole == Roles.Admin)
                be = SQL.ReadListString($"SELECT beFlaeche FROM {MainWindow.table}.beBelegung WHERE Projektleiter = '{Environment.UserName}' AND bis > now()").Result.Distinct().ToList(); //FillBEList();
            else
                be = SQL.ReadListString($"SELECT beFlaeche FROM {MainWindow.table}.beBelegung WHERE Projektleiter = '{Environment.UserName}' AND bis > now()").Result.Distinct().ToList();


            if (be.Count > 0)
            {
                cbBE.ItemsSource = be;
                BEItems = be;
                BEColumnIsEnabled = true;

            }
            else
            {
                cbBE.IsEnabled = false;
                BEColumnIsEnabled = false;


                ToolTipService.SetInitialShowDelay(cbBE, 100);
                ToolTipService.SetShowOnDisabled(cbBE, true);
            }
        }

        private void ShowTooltip(object sender, MouseEventArgs e)
        {
            //BEPopup.IsOpen = false;
            //BEPopup.IsOpen = true;
        }

        private void UnShowTooltip(object sender, RoutedEventArgs e)
        {
            //BEPopup.IsOpen = false;
        }

        private void GoToBEBuchung_Click(object sender, RoutedEventArgs e)
        {
            Belegung bel = new Belegung();
            bel.Owner = this;
            bel.ShowDialog();

            LoadBEs();
        }

        private void updateList()
        {
            if (MainWindow.LoggedInRole == Roles.Admin || MainWindow.LoggedInRole == Roles.M2_AM || MainWindow.LoggedInRole == Roles.Pförtner)
            {
                requestListAdmin();
            }
            else
            {
                requestList();
            }
        }

        private void requestList()
        {
            firmen = SQL.ReadSQL($"SELECT * FROM {MainWindow.table}.firmen WHERE Ersteller = '{Environment.UserName}' " +
                $"OR Ersteller = '{Environment.UserDomainName}{Environment.UserName}' " +
                $"OR Ersteller = '{SQL.ReadSingleValue($"SELECT Vertreter FROM {MainWindow.table}.ansprechpartner WHERE Name = '{Helper.InsertSpaceBeforeUpperCase(Environment.UserName)}'").Replace("-", "").Replace(" ", "")}' " +
                $"OR Ersteller = '{Environment.UserDomainName}{SQL.ReadSingleValue($"SELECT Vertreter FROM {MainWindow.table}.ansprechpartner WHERE Name = '{Helper.InsertSpaceBeforeUpperCase(Environment.UserName)}'").Replace("-", "").Replace(" ", "")}' " +
                $"OR Ersteller = '{SQL.ReadSingleValue($"SELECT Name FROM {MainWindow.table}.ansprechpartner WHERE Vertreter = '{Helper.InsertSpaceBeforeUpperCase(Environment.UserName)}'").Replace("-", "").Replace(" ", "")}' " +
                $"OR Ersteller = '{Environment.UserDomainName}{SQL.ReadSingleValue($"SELECT Name FROM {MainWindow.table}.ansprechpartner WHERE Vertreter = '{Helper.InsertSpaceBeforeUpperCase(Environment.UserName)}'").Replace("-", "").Replace(" ", "")}' " +
                $"OR Ansprechpartner_Intern = '{Helper.InsertSpaceBeforeUpperCase(Environment.UserName)}' ORDER BY Name ASC"
                , firmen).Result;
            //FirmaView = Firma.DataTableToFirma(firmen);
            dgFirmen.DataContext = firmen;

            firmenSearchList.Clear();

            foreach (var firma in firmen.AsEnumerable().Select(p => p.Field<string>("Name").Trim()).ToList().Distinct())
            {
                if (firma.Contains(' '))
                {
                    firmenSearchList.Add(firma, new List<string>());

                    for (var i = 0; i < firma.Split(' ').Count(); i++)
                        firmenSearchList[firma].Add(firma.Split(' ')[i]);
                }
                else firmenSearchList.Add(firma, new List<string>());
            }
        }

        private void requestListAdmin()
        {
            firmen = SQL.ReadSQL($"SELECT * FROM {MainWindow.table}.firmen ORDER BY Name ASC", firmen).Result;
            //FirmaView = Firma.DataTableToFirma(firmen);
            dgFirmen.DataContext = firmen;

            firmenSearchList.Clear();

            foreach (var firma in firmen.AsEnumerable().Select(p => p.Field<string>("Name").Trim()).ToList().Distinct())
            {
                if (firma.Contains(' '))
                {
                    firmenSearchList.Add(firma, new List<string>());

                    for (var i = 0; i < firma.Split(' ').Count(); i++)
                        firmenSearchList[firma].Add(firma.Split(' ')[i]);
                }
                else firmenSearchList.Add(firma, new List<string>());
            }
        }

        private List<string> FillBEList()
        {
            List<string> BEs = new List<string>();
            var numbers = Helper.GetBENumbers();
            var desc = Helper.GetBEDescription();
            var files = Helper.GetBEFileNames();

            BEs.Add("");

            for (int i = 0; i < numbers.Count; i++)
            {
                BEs.Add($"BE-Fläche {numbers[i]} ({desc[i]})");
            }

            return BEs;
        }

        private void BtnClose_Click(object sender, RoutedEventArgs e)
        {
            dpArbeitsbeginn.IsDropDownOpen = false;
            dpArbeitsende.IsDropDownOpen = false;
            dpEinweisung_Bis.IsDropDownOpen = false;

            this.Close();
        }


        bool added = false;

        private async void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            tt.IsOpen = false;
            this.Cursor = Cursors.Wait;

            try
            {
                if (firmenSearchList.Keys.Select(p => p.ToLower()).Contains(tbName.Text.Trim().ToLower()))
                {
                    if (MessageBox.Show($"Die Firma {tbName.Text} ist bereits angelegt.\n" +
                        $"Firmen dürfen nur mehrfach angelegt werden, wenn diese an mehreren Projekten gleichzeitig im Werk arbeiten!\n\n" +
                        $"Ist dies nicht der Fall, bitte die Firma in der Liste bearbeiten.\n" +
                        $"Hierfür einfach die zu ändernden Felder anklicken und bearbeiten.\n\n" +
                        $"Sollte es sich um eine andere Firma handeln, kann diese Meldung ignoriert werden\n" +
                        $"Möchten Sie diese Firma sicher nochmals hinzufügen?", "Doppelter Eintrag", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No)
                    {
                        return;
                    }
                }
                else
                {
                    List<string> similarities = new List<string>();

                    foreach (var item in firmenSearchList)
                    {
                        if (item.Value.Count > 0)
                        {
                            foreach (var val in item.Value)
                                if (Fuzz.Ratio(tbName.Text.ToLower(), val.ToLower()) > 80)
                                    similarities.Add(item.Key);
                        }
                        else if (Fuzz.Ratio(tbName.Text.ToLower(), item.Key.ToLower()) > 80)
                            similarities.Add(item.Key);
                    }

                    if (similarities.Count > 0)
                    {
                        similarities.Sort();
                        if (MessageBox.Show($"Die Firma {tbName.Text} ist sehr ähnlich zu der Firma {Helper.FirstCharToUpperCase(similarities.First())}.\n" +
                            $"Firmen dürfen nur mehrfach angelegt werden, wenn diese an mehreren Projekten gleichzeitig im Werk arbeiten!\n\n" +
                            $"Ist dies nicht der Fall, bitte die Firma in der Liste bearbeiten.\n" +
                            $"Hierfür einfach die zu ändernden Felder anklicken und bearbeiten.\n\n" +
                            $"Sollte es sich um eine andere Firma handeln, kann diese Meldung ignoriert werden\n" +
                            $"Möchten Sie diese Firma sicher hinzufügen?", "Doppelter Eintrag?", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No)
                        {
                            return;
                        }
                    }
                }

                if (string.IsNullOrWhiteSpace(tbName.Text))
                {
                    MessageBox.Show("Namen eintragen!", "Fehler");
                    return;
                }
                else if (string.IsNullOrWhiteSpace(tbVerantwortlicher_MA.Text))
                {
                    MessageBox.Show("Verantwortlichen MA eintragen!", "Fehler");
                    return;
                }
                else if (tbVerantwortlicher_MA.Text.ToList<char>().Distinct().Count() < 5)
                {
                    MessageBox.Show("Verantwortlicher MA der Firma muss qualifiziert angegeben werden!\nFalls kein Verantwortlicher der Firma bekannt ist, den Namen des Erstellers eintragen", "Fehler");
                    return;
                }
                else if (string.IsNullOrWhiteSpace(tbTel_Firma.Text))
                {
                    MessageBox.Show("Telefonnummer der Firma eintragen!", "Fehler");
                    return;
                }
                else if (tbTel_Firma.Text.ToList<char>().Distinct().Count() < 5)
                {
                    MessageBox.Show("Telefonnummer der Firma muss qualifiziert angegeben werden!\nFalls keine Nummer des MA der Firma bekannt, die Nummer des Erstellers eintragen", "Fehler");
                    return;
                }
                else if (!System.Text.RegularExpressions.Regex.IsMatch(tbTel_Firma.Text, "^[0-9()+\\-/ ]*$"))
                {
                    MessageBox.Show("Telefonnummer der Firma muss qualifiziert angegeben werden!\nFalls keine Nummer des MA der Firma bekannt, die Nummer des Erstellers eintragen", "Fehler");
                    return;
                }
                else if (!dpArbeitsbeginn.SelectedDate.HasValue)
                {
                    MessageBox.Show("Arbeitsbeginn eintragen!", "Fehler");
                    return;
                }
                else if (!dpArbeitsende.SelectedDate.HasValue)
                {
                    MessageBox.Show("Arbeitsende eintragen!", "Fehler");
                    return;
                }
                else if (string.IsNullOrWhiteSpace(tbAnzahl_Fzg.Text))
                {
                    MessageBox.Show("Anzahl Fahrzeuge eintragen!", "Fehler");
                    return;
                }
                else if (string.IsNullOrWhiteSpace(tbBeauftragte_Leistung.Text))
                {
                    MessageBox.Show("Beauftragte Leistung eintragen!", "Fehler");
                    return;
                }
                else if (tbBeauftragte_Leistung.Text.ToList<char>().Distinct().Count() < 3)
                {
                    MessageBox.Show("Beauftragte Leistung muss qualifiziert angegeben werden!", "Fehler");
                    return;
                }
                else if (!dpEinweisung_Bis.SelectedDate.HasValue && (GetDPText() != "...Einweisung folgt..." && GetDPText() != "...Nur in Begleitung..."))
                {
                    MessageBox.Show("'Einweisung bis' eintragen", "Fehler");
                    return;
                }
                else if (cbAnsprechpartner_Intern.SelectedIndex == -1)
                {
                    MessageBox.Show("'Ansprechpartner intern' auswählen!", "Fehler");
                    return;
                }
                else if (!dpEinweisung_Bis.SelectedDate.HasValue && GetDPText() == "...Einweisung folgt...")
                {
                    if (dpArbeitsende.SelectedDate.Value < dpArbeitsbeginn.SelectedDate.Value)
                    {
                        MessageBox.Show(this, "Arbeitsende darf nicht kleiner als Arbeitsbeginn sein", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    else if (dpArbeitsbeginn.SelectedDate.Value > dpArbeitsende.SelectedDate.Value)
                    {
                        MessageBox.Show(this, "Arbeitsbeginn darf nicht größer als Arbeitsende sein", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    else
                    {
                        if (MessageBox.Show(this, "Einweisung muss durchgeführt und manuell nachgetragen werden!!\n\nMit dem Hinzufügen fortfahren?", "Achtung!", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
                        {
                            if (!System.Text.RegularExpressions.Regex.IsMatch(tbAnzahl_Begleiter.Text, "^[0-9]*$"))
                            {
                                MessageBox.Show(this, "Anzahl Begleiter darf nur Zahlen enthalten", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                                return;
                            }
                            else if (!System.Text.RegularExpressions.Regex.IsMatch(tbAnzahl_Fzg.Text, "^[0-9]*$"))
                            {
                                MessageBox.Show(this, "Anzahl Fzg. darf nur Zahlen enthalten", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                                return;
                            }
                            else
                            {
                                if (Convert.ToInt16(tbAnzahl_Fzg.Text) > 1)
                                {
                                    //var res = MessageBox.Show(fzgMessage, "Fahrzeuganzahl > 1", MessageBoxButton.YesNoCancel, MessageBoxImage.Exclamation);
                                    XMessageBoxFahrzeugAnzahl msg = new XMessageBoxFahrzeugAnzahl();
                                    msg.ShowDialog();

                                    var res = msg.ResultButton;
                                    var mail = msg.ResultText;

                                    var wunsch = "";
                                    if (MessageBoxResult.Yes == res)
                                    {
                                        wunsch = tbAnzahl_Fzg.Text;
                                        tbAnzahl_Fzg.Text = "1";  // Vorerst auf 1 setzen und nach Genehmigung auf gewünschte Anzahl
                                    }
                                    else if (MessageBoxResult.No == res)
                                    {
                                        tbAnzahl_Fzg.Text = "1";
                                    }
                                    else return;

                                    //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Ersteller) VALUES " +
                                    //                $"('{tbName.Text}','{tbVerantwortlicher_MA.Text}','{tbTel_Firma.Text}','{tbAnzahl_Begleiter.Text}','{tbAnzahl_Fzg.Text}','{tbBeauftragte_Leistung.Text}','{dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")}','{dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")}','1902-01-01','{cbAnsprechpartner_Intern.Text}','{tbTel_Nr_Ansprechpartner_Intern.Text}','{Environment.UserName}')");

                                    var lastID = await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Ersteller) VALUES " +
                                        $"(@Name,@Verantwortlicher_MA_Firma,@Tel_Firma,@Anzahl_Begleiter,@Anzahl_Fzg,@Beauftragte_Leistung,@Arbeitsbeginn,@Arbeitsende,@Einweisung_bis,@Asp_intern,@Tel_Nr_Asp,@Ersteller)", new List<MySqlParameter>()
                                    {
                                        new MySqlParameter("@Name", tbName.Text),
                                        new MySqlParameter("@Verantwortlicher_MA_Firma", tbVerantwortlicher_MA.Text),
                                        new MySqlParameter("@Tel_Firma", tbTel_Firma.Text),
                                        new MySqlParameter("@Anzahl_Begleiter", tbAnzahl_Begleiter.Text),
                                        new MySqlParameter("@Anzahl_Fzg", tbAnzahl_Fzg.Text),
                                        new MySqlParameter("@Beauftragte_Leistung", tbBeauftragte_Leistung.Text),
                                        new MySqlParameter("@Arbeitsbeginn", dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                        new MySqlParameter("@Arbeitsende", dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                        new MySqlParameter("@Einweisung_bis","1902-01-01"),
                                        new MySqlParameter("@Asp_intern", cbAnsprechpartner_Intern.Text),
                                        new MySqlParameter("@Tel_Nr_Asp", tbTel_Nr_Ansprechpartner_Intern.Text),
                                        new MySqlParameter("@Ersteller", Environment.UserName)
                                    });


                                    if (!string.IsNullOrWhiteSpace(wunsch) && Convert.ToInt16(wunsch) > 1)
                                    {
                                        //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.fzgAnmeldung (idFirmen,AnzahlFzg,User) VALUES (LAST_INSERT_ID(),'{wunsch}','{Environment.UserName}')");
                                        await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.fzgAnmeldung (idFirmen,AnzahlFzg,User,Email) VALUES (@lastID,@wunsch,@user,@mail)", new List<MySqlParameter>()
                                        {
                                            new MySqlParameter("@lastID", lastID),
                                            new MySqlParameter("@wunsch", wunsch),
                                            new MySqlParameter("@user", Environment.UserName),
                                            new MySqlParameter("@mail", mail)
                                        });
                                    }


                                    await SQL.CreateAndWriteSQL($"REPLACE INTO {MainWindow.table}.firmenPeople (idFirmen, Personen, TelNr) VALUES (@idFirmen, @personen, @telnr)", new List<MySqlParameter>()
                                        {
                                            new MySqlParameter("@idFirmen", lastID),
                                            new MySqlParameter("@personen", $"{Personen}"),
                                            new MySqlParameter("@telnr", $"{TelNr}")
                                        });

                                    updateList();

                                    dgFirmen.ScrollIntoView(dgFirmen.Items[dgFirmen.Items.Count - 1]); //scroll to last
                                    dgFirmen.UpdateLayout();
                                    ResetInput();
                                }
                                else
                                {
                                    //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Ersteller) VALUES " +
                                    //                $"('{tbName.Text}','{tbVerantwortlicher_MA.Text}','{tbTel_Firma.Text}','{tbAnzahl_Begleiter.Text}','{tbAnzahl_Fzg.Text}','{tbBeauftragte_Leistung.Text}','{dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")}','{dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")}','1902-01-01','{cbAnsprechpartner_Intern.Text}','{tbTel_Nr_Ansprechpartner_Intern.Text}','{Environment.UserName}')");


                                    var lastID = await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Ersteller) VALUES " +
                                      $"(@Name,@Verantwortlicher_MA_Firma,@Tel_Firma,@Anzahl_Begleiter,@Anzahl_Fzg,@Beauftragte_Leistung,@Arbeitsbeginn,@Arbeitsende,@Einweisung_bis,@Asp_intern,@Tel_Nr_Asp,@Ersteller)", new List<MySqlParameter>()
                                  {
                                        new MySqlParameter("@Name", tbName.Text),
                                        new MySqlParameter("@Verantwortlicher_MA_Firma", tbVerantwortlicher_MA.Text),
                                        new MySqlParameter("@Tel_Firma", tbTel_Firma.Text),
                                        new MySqlParameter("@Anzahl_Begleiter", tbAnzahl_Begleiter.Text),
                                        new MySqlParameter("@Anzahl_Fzg", tbAnzahl_Fzg.Text),
                                        new MySqlParameter("@Beauftragte_Leistung", tbBeauftragte_Leistung.Text),
                                        new MySqlParameter("@Arbeitsbeginn", dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                        new MySqlParameter("@Arbeitsende", dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                        new MySqlParameter("@Einweisung_bis","1902-01-01"),
                                        new MySqlParameter("@Asp_intern", cbAnsprechpartner_Intern.Text),
                                        new MySqlParameter("@Tel_Nr_Asp", tbTel_Nr_Ansprechpartner_Intern.Text),
                                        new MySqlParameter("@Ersteller", Environment.UserName)
                                  });


                                    await SQL.CreateAndWriteSQL($"REPLACE INTO {MainWindow.table}.firmenPeople (idFirmen, Personen, TelNr) VALUES (@lastID, @personen, @telnr)", new List<MySqlParameter>()
                                        {
                                            new MySqlParameter("@lastID", lastID),
                                            new MySqlParameter("@personen", $"{Personen}"),
                                            new MySqlParameter("@telnr", $"{TelNr}")
                                        });

                                    //if (!string.IsNullOrWhiteSpace(tbAnzahl_Fzg.Text)) await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.fzgAnmeldung (idFirmen,AnzahlFzg,User) VALUES (LAST_INSERT_ID(),'{tbAnzahl_Fzg.Text}','{Environment.UserName}')");

                                    updateList();

                                    dgFirmen.ScrollIntoView(dgFirmen.Items[dgFirmen.Items.Count - 1]); //scroll to last
                                    dgFirmen.UpdateLayout();
                                    ResetInput();
                                }
                            }
                        }
                    }
                }
                else if (!dpEinweisung_Bis.SelectedDate.HasValue && GetDPText() == "...Nur in Begleitung...")
                {
                    if (dpArbeitsende.SelectedDate.Value < dpArbeitsbeginn.SelectedDate.Value)
                    {
                        MessageBox.Show(this, "Arbeitsende darf nicht kleiner als Arbeitsbeginn sein", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    else if (dpArbeitsbeginn.SelectedDate.Value > dpArbeitsende.SelectedDate.Value)
                    {
                        MessageBox.Show(this, "Arbeitsbeginn darf nicht größer als Arbeitsende sein", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    else
                    {
                        if (MessageBox.Show(this, "Firmen dürfen sich nur in Begleitung auf dem Gelände bewegen!!\n\nMit dem Hinzufügen fortfahren?", "Achtung!", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
                        {
                            if (!System.Text.RegularExpressions.Regex.IsMatch(tbAnzahl_Begleiter.Text, "^[0-9]*$"))
                            {
                                MessageBox.Show(this, "Anzahl Begleiter darf nur Zahlen enthalten", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                                return;
                            }
                            else if (!System.Text.RegularExpressions.Regex.IsMatch(tbAnzahl_Fzg.Text, "^[0-9]*$"))
                            {
                                MessageBox.Show(this, "Anzahl Fzg. darf nur Zahlen enthalten", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                                return;
                            }
                            else
                            {
                                if (Convert.ToInt16(tbAnzahl_Fzg.Text) > 1)
                                {
                                    //var res = MessageBox.Show(fzgMessage, "Fahrzeuganzahl > 1", MessageBoxButton.YesNoCancel, MessageBoxImage.Exclamation);
                                    XMessageBoxFahrzeugAnzahl msg = new XMessageBoxFahrzeugAnzahl();
                                    msg.ShowDialog();

                                    var res = msg.ResultButton;
                                    var mail = msg.ResultText;

                                    var wunsch = "";
                                    if (MessageBoxResult.Yes == res)
                                    {
                                        wunsch = tbAnzahl_Fzg.Text;
                                        tbAnzahl_Fzg.Text = "1";  // Vorerst auf 1 setzen und nach Genehmigung auf gewünschte Anzahl
                                    }
                                    else if (MessageBoxResult.No == res)
                                    {
                                        tbAnzahl_Fzg.Text = "1";
                                    }
                                    else return;

                                    //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Ersteller) VALUES " +
                                    //                $"('{tbName.Text}','{tbVerantwortlicher_MA.Text}','{tbTel_Firma.Text}','{tbAnzahl_Begleiter.Text}','{tbAnzahl_Fzg.Text}','{tbBeauftragte_Leistung.Text}','{dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")}','{dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")}','1903-01-01','{cbAnsprechpartner_Intern.Text}','{tbTel_Nr_Ansprechpartner_Intern.Text}','{Environment.UserName}')");

                                    var lastID = await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Ersteller) VALUES " +
                                                    $"(@name,@verantwortlich,@telFirma,@AnzBegleiter,@Anzahl_Fzg,@Beauftragte_Leistung,@Arbeitsbeginn,@Arbeitsende,'1903-01-01',@Ansprechpartner_Intern,@Tel_Nr_Ansprechpartner_Intern,@Ersteller)", new List<MySqlParameter>()
                                                    {
                                                        new MySqlParameter("@name", tbName.Text),
                                                        new MySqlParameter("@verantwortlich",tbVerantwortlicher_MA.Text),
                                                        new MySqlParameter("@telFirma",tbTel_Firma.Text),
                                                        new MySqlParameter("@AnzBegleiter", tbAnzahl_Begleiter.Text),
                                                        new MySqlParameter("@Anzahl_Fzg",tbAnzahl_Fzg.Text),
                                                        new MySqlParameter("@Beauftragte_Leistung",tbBeauftragte_Leistung.Text),
                                                        new MySqlParameter("@Arbeitsbeginn", dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                        new MySqlParameter("@Arbeitsende",dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                        new MySqlParameter("@Ansprechpartner_Intern", cbAnsprechpartner_Intern.Text),
                                                        new MySqlParameter("@Tel_Nr_Ansprechpartner_Intern", tbTel_Nr_Ansprechpartner_Intern.Text),
                                                        new MySqlParameter("@Ersteller", Environment.UserName)
                                                    });

                                    await SQL.CreateAndWriteSQL($"REPLACE INTO {MainWindow.table}.firmenPeople (idFirmen, Personen, TelNr) VALUES (@idFirmen, @personen, @telnr)", new List<MySqlParameter>()
                                        {
                                            new MySqlParameter("@idFirmen", lastID),
                                            new MySqlParameter("@personen", $"{Personen}"),
                                            new MySqlParameter("@telnr", $"{TelNr}")
                                        });
                                    //if (!string.IsNullOrWhiteSpace(wunsch) && Convert.ToInt16(wunsch) > 1) 
                                    //    await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.fzgAnmeldung (idfirmen,AnzahlFzg,User) VALUES (LAST_INSERT_ID(),'{wunsch}','{Environment.UserName}')");
                                    if (!string.IsNullOrWhiteSpace(wunsch) && Convert.ToInt16(wunsch) > 1)
                                    {
                                        //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.fzgAnmeldung (idFirmen,AnzahlFzg,User) VALUES (LAST_INSERT_ID(),'{wunsch}','{Environment.UserName}')");
                                        await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.fzgAnmeldung (idFirmen,AnzahlFzg,User,Email) VALUES (@lastID,@wunsch,@user,@mail)", new List<MySqlParameter>()
                                        {
                                            new MySqlParameter("@lastID", lastID),
                                            new MySqlParameter("@wunsch", wunsch),
                                            new MySqlParameter("@user", Environment.UserName),
                                            new MySqlParameter("@mail", mail)
                                        });
                                    }


                                    updateList();

                                    dgFirmen.ScrollIntoView(dgFirmen.Items[dgFirmen.Items.Count - 1]); //scroll to last
                                    dgFirmen.UpdateLayout();
                                    ResetInput();
                                }
                                else
                                {
                                    //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Ersteller) VALUES " +
                                    //                $"('{tbName.Text}','{tbVerantwortlicher_MA.Text}','{tbTel_Firma.Text}','{tbAnzahl_Begleiter.Text}','{tbAnzahl_Fzg.Text}','{tbBeauftragte_Leistung.Text}','{dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")}','{dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")}','1903-01-01','{cbAnsprechpartner_Intern.Text}','{tbTel_Nr_Ansprechpartner_Intern.Text}','{Environment.UserName}')");


                                    var lastID = await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Ersteller) VALUES " +
                                                    $"(@name,@verantwortlich,@telFirma,@AnzBegleiter,@Anzahl_Fzg,@Beauftragte_Leistung,@Arbeitsbeginn,@Arbeitsende,'1903-01-01',@Ansprechpartner_Intern,@Tel_Nr_Ansprechpartner_Intern,@Ersteller)", new List<MySqlParameter>()
                                                    {
                                                        new MySqlParameter("@name", tbName.Text),
                                                        new MySqlParameter("@verantwortlich",tbVerantwortlicher_MA.Text),
                                                        new MySqlParameter("@telFirma",tbTel_Firma.Text),
                                                        new MySqlParameter("@AnzBegleiter", tbAnzahl_Begleiter.Text),
                                                        new MySqlParameter("@Anzahl_Fzg",tbAnzahl_Fzg.Text),
                                                        new MySqlParameter("@Beauftragte_Leistung",tbBeauftragte_Leistung.Text),
                                                        new MySqlParameter("@Arbeitsbeginn", dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                        new MySqlParameter("@Arbeitsende",dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                        new MySqlParameter("@Ansprechpartner_Intern", cbAnsprechpartner_Intern.Text),
                                                        new MySqlParameter("@Tel_Nr_Ansprechpartner_Intern", tbTel_Nr_Ansprechpartner_Intern.Text),
                                                        new MySqlParameter("@Ersteller", Environment.UserName)
                                                    });


                                    await SQL.CreateAndWriteSQL($"REPLACE INTO {MainWindow.table}.firmenPeople (idFirmen, Personen, TelNr) VALUES (@lastID, @personen, @telnr)", new List<MySqlParameter>()
                                        {
                                            new MySqlParameter("@lastID", lastID),
                                            new MySqlParameter("@personen", $"{Personen}"),
                                            new MySqlParameter("@telnr", $"{TelNr}")
                                        });

                                    //if (!string.IsNullOrWhiteSpace(tbAnzahl_Fzg.Text)) await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.fzgAnmeldung (idfirmen,AnzahlFzg,User) VALUES (LAST_INSERT_ID(),'{tbAnzahl_Fzg.Text}','{Environment.UserName}')");


                                    updateList();

                                    dgFirmen.ScrollIntoView(dgFirmen.Items[dgFirmen.Items.Count - 1]); //scroll to last
                                    dgFirmen.UpdateLayout();
                                    ResetInput();
                                }
                            }
                        }
                    }
                }
                else
                {
                    if (!System.Text.RegularExpressions.Regex.IsMatch(tbAnzahl_Begleiter.Text, "^[0-9]*$"))
                    {
                        MessageBox.Show(this, "Anzahl Begleiter darf nur Zahlen enthalten", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                        return;
                    }
                    else if (!System.Text.RegularExpressions.Regex.IsMatch(tbAnzahl_Fzg.Text, "^[0-9]*$"))
                    {
                        MessageBox.Show(this, "Anzahl Fzg. darf nur Zahlen enthalten", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                        return;
                    }
                    else if (dpArbeitsende.SelectedDate.Value < dpArbeitsbeginn.SelectedDate.Value)
                    {
                        MessageBox.Show(this, "Arbeitsende darf nicht kleiner als Arbeitsbeginn sein", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    else if (dpArbeitsbeginn.SelectedDate.Value > dpArbeitsende.SelectedDate.Value)
                    {
                        MessageBox.Show(this, "Arbeitsbeginn darf nicht größer als Arbeitsende sein", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    else
                    {
                        if (Convert.ToInt16(tbAnzahl_Fzg.Text) > 1)
                        {
                            //var res = MessageBox.Show(fzgMessage, "Fahrzeuganzahl > 1", MessageBoxButton.YesNoCancel, MessageBoxImage.Exclamation);
                            XMessageBoxFahrzeugAnzahl msg = new XMessageBoxFahrzeugAnzahl();
                            msg.ShowDialog();

                            var res = msg.ResultButton;
                            var mail = msg.ResultText;

                            var wunsch = "";
                            if (MessageBoxResult.Yes == res)
                            {
                                wunsch = tbAnzahl_Fzg.Text;
                                tbAnzahl_Fzg.Text = "1";  // Vorerst auf 1 setzen und nach Genehmigung auf gewünschte Anzahl
                            }
                            else if (MessageBoxResult.No == res)
                            {
                                tbAnzahl_Fzg.Text = "1";
                            }
                            else return;

                            //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,BE,BEint,Ersteller) VALUES " +
                            //                                    $"('{tbName.Text}','{tbVerantwortlicher_MA.Text}','{tbTel_Firma.Text}','{tbAnzahl_Begleiter.Text}','{tbAnzahl_Fzg.Text}','{tbBeauftragte_Leistung.Text}','{dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")}','{dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")}','{dpEinweisung_Bis.SelectedDate.Value.ToString("yyyy-MM-dd")}','{cbAnsprechpartner_Intern.Text}','{tbTel_Nr_Ansprechpartner_Intern.Text}','{cbBE.Text}','{cbBE.SelectedIndex}','{Environment.UserName}')");


                            var lastID = await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Ersteller) VALUES " +
                                                        $"(@name,@verantwortlich,@telFirma,@AnzBegleiter,@Anzahl_Fzg,@Beauftragte_Leistung,@Arbeitsbeginn,@Arbeitsende,'1903-01-01',@Ansprechpartner_Intern,@Tel_Nr_Ansprechpartner_Intern,@Ersteller)", new List<MySqlParameter>()
                                                        {
                                                                new MySqlParameter("@name", tbName.Text),
                                                                new MySqlParameter("@verantwortlich",tbVerantwortlicher_MA.Text),
                                                                new MySqlParameter("@telFirma",tbTel_Firma.Text),
                                                                new MySqlParameter("@AnzBegleiter", tbAnzahl_Begleiter.Text),
                                                                new MySqlParameter("@Anzahl_Fzg",tbAnzahl_Fzg.Text),
                                                                new MySqlParameter("@Beauftragte_Leistung",tbBeauftragte_Leistung.Text),
                                                                new MySqlParameter("@Arbeitsbeginn", dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                                new MySqlParameter("@Arbeitsende",dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                                new MySqlParameter("@Ansprechpartner_Intern", cbAnsprechpartner_Intern.Text),
                                                                new MySqlParameter("@Tel_Nr_Ansprechpartner_Intern", tbTel_Nr_Ansprechpartner_Intern.Text),
                                                                new MySqlParameter("@Ersteller", Environment.UserName)
                                                        });


                            await SQL.CreateAndWriteSQL($"REPLACE INTO {MainWindow.table}.firmenPeople (idFirmen, Personen, TelNr) VALUES (@idFirmen, @personen, @telnr)", new List<MySqlParameter>()
                                        {
                                            new MySqlParameter("@idFirmen", lastID),
                                            new MySqlParameter("@personen", $"{Personen}"),
                                            new MySqlParameter("@telnr", $"{TelNr}")
                                        });
                            //if (!string.IsNullOrWhiteSpace(wunsch) && Convert.ToInt16(wunsch) > 1) await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.fzgAnmeldung (idfirmen,AnzahlFzg,User) VALUES (LAST_INSERT_ID(),'{wunsch}','{Environment.UserName}')");
                            if (!string.IsNullOrWhiteSpace(wunsch) && Convert.ToInt16(wunsch) > 1)
                            {
                                //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.fzgAnmeldung (idFirmen,AnzahlFzg,User) VALUES (LAST_INSERT_ID(),'{wunsch}','{Environment.UserName}')");
                                await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.fzgAnmeldung (idFirmen,AnzahlFzg,User,Email) VALUES (@lastID,@wunsch,@user,@mail)", new List<MySqlParameter>()
                                                            {
                                                                new MySqlParameter("@lastID", lastID),
                                                                new MySqlParameter("@wunsch", wunsch),
                                                                new MySqlParameter("@user", Environment.UserName),
                                                                new MySqlParameter("@mail", mail)
                                                            });
                            }


                            updateList();

                            dgFirmen.ScrollIntoView(dgFirmen.Items[dgFirmen.Items.Count - 1]); //scroll to last
                            dgFirmen.UpdateLayout();
                            ResetInput();
                        }
                        else
                        {
                            //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,BE,BEint,Ersteller) VALUES " +
                            //                                    $"('{tbName.Text}','{tbVerantwortlicher_MA.Text}','{tbTel_Firma.Text}','{tbAnzahl_Begleiter.Text}','{tbAnzahl_Fzg.Text}','{tbBeauftragte_Leistung.Text}','{dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")}','{dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")}','{dpEinweisung_Bis.SelectedDate.Value.ToString("yyyy-MM-dd")}','{cbAnsprechpartner_Intern.Text}','{tbTel_Nr_Ansprechpartner_Intern.Text}','{cbBE.Text}','{cbBE.SelectedIndex}','{Environment.UserName}')");

                            var lastID = await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.firmen (Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Örtliche_Einweisung_bis,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Ersteller) VALUES " +
                                                        $"(@name,@verantwortlich,@telFirma,@AnzBegleiter,@Anzahl_Fzg,@Beauftragte_Leistung,@Arbeitsbeginn,@Arbeitsende,'1903-01-01',@Ansprechpartner_Intern,@Tel_Nr_Ansprechpartner_Intern,@Ersteller)", new List<MySqlParameter>()
                                                        {
                                                                new MySqlParameter("@name", tbName.Text),
                                                                new MySqlParameter("@verantwortlich",tbVerantwortlicher_MA.Text),
                                                                new MySqlParameter("@telFirma",tbTel_Firma.Text),
                                                                new MySqlParameter("@AnzBegleiter", tbAnzahl_Begleiter.Text),
                                                                new MySqlParameter("@Anzahl_Fzg",tbAnzahl_Fzg.Text),
                                                                new MySqlParameter("@Beauftragte_Leistung",tbBeauftragte_Leistung.Text),
                                                                new MySqlParameter("@Arbeitsbeginn", dpArbeitsbeginn.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                                new MySqlParameter("@Arbeitsende",dpArbeitsende.SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                                new MySqlParameter("@Ansprechpartner_Intern", cbAnsprechpartner_Intern.Text),
                                                                new MySqlParameter("@Tel_Nr_Ansprechpartner_Intern", tbTel_Nr_Ansprechpartner_Intern.Text),
                                                                new MySqlParameter("@Ersteller", Environment.UserName)
                                                        });

                            //SQL.ReadSingleValue("SELECT LAST_INSERT_ID()");

                            await SQL.CreateAndWriteSQL($"REPLACE INTO {MainWindow.table}.firmenPeople (idFirmen, Personen, TelNr) VALUES (@lastID, @personen, @telnr)", new List<MySqlParameter>()
                                        {
                                            new MySqlParameter("@lastID", lastID),
                                            new MySqlParameter("@personen", $"{Personen}"),
                                            new MySqlParameter("@telnr", $"{TelNr}")
                                        });

                            //if (!string.IsNullOrWhiteSpace(tbAnzahl_Fzg.Text)) await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.fzgAnmeldung (idfirmen,AnzahlFzg,User) VALUES (LAST_INSERT_ID(),'{tbAnzahl_Fzg.Text}','{Environment.UserName}')");

                            updateList();

                            dgFirmen.ScrollIntoView(dgFirmen.Items[dgFirmen.Items.Count - 1]); //scroll to last
                            dgFirmen.UpdateLayout();
                            ResetInput();
                        }
                    }
                }

                added = true;
            }
            catch (Exception)
            {

            }
            finally
            {
                timer.Interval = TimeSpan.FromMilliseconds(50);
                timer.Tick += Timer_Tick;
                timer.Start();

                this.Cursor = Cursors.Arrow;
            }
        }

        private void ResetInput()
        {
            tbName.Text = "";
            tbVerantwortlicher_MA.Text = "";
            tbTel_Firma.Text = "";
            tbAnzahl_Begleiter.Text = "";
            tbAnzahl_Fzg.Text = "";
            tbBeauftragte_Leistung.Text = "";
            dpArbeitsbeginn.Text = "";
            dpArbeitsende.Text = "";
            dpEinweisung_Bis.Text = "";
            cbBE.SelectedIndex = -1;
            cbAnsprechpartner_Intern.SelectedIndex = -1;
            tbTel_Nr_Ansprechpartner_Intern.Text = "";
        }

        private void CbAnsprechpartner_Intern_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string test = SQL.ReadSingleValue($"SELECT Tel_Nr FROM {MainWindow.table}.ansprechpartner WHERE Name='{cbAnsprechpartner_Intern.SelectedValue}'");
            tbTel_Nr_Ansprechpartner_Intern.Text = test;
        }



        private void dgFirmen_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            dgFirmen.PreviewKeyDown -= DgFirmen_PreviewKeyDown;
        }

        private async void DgFirmen_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var dg = sender as DataGrid;
            var row = dg.SelectedItem as DataRowView;
            var arr = row.Row.ItemArray;

            if (e.Key == Key.Delete)
            {
                deleteRow(arr);
            }
        }


        private async void DgFirmen_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            try
            {
                string newValue = "";
                var header = e.Column.Header;
                if (e.EditingElement.GetType() == typeof(TextBox))
                {
                    newValue = (e.EditingElement as TextBox).Text;
                }
                else
                {
                    e.Cancel = true;
                    return;
                }

                var id = (e.Row.Item as DataRowView).Row.ItemArray[0];
                DateTime date = DateTime.Now;

                if (DateTime.TryParse(newValue, out date))
                    if (date <= DateTime.Now + TimeSpan.FromDays(365)) newValue = date.ToString("yyyy-MM-dd");
                    else
                    {
                        MessageBox.Show(this, "Daten dürfen maximal 365 Tage in der Zukunft liegen", "Fehler!", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                        newValue = (DateTime.Now + TimeSpan.FromDays(365)).ToString("yyyy-MM-dd");
                    }

                var MessageValue = newValue;
                var MessageDate = DateTime.Now;
                if (DateTime.TryParse(newValue, out MessageDate))
                    MessageValue = MessageDate.ToString("dd.MM.yyyy");


                if (string.IsNullOrWhiteSpace(newValue.ToString()))
                {
                    MessageBox.Show(this, "Eintrag darf nicht leer sein!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                    e.Cancel = true;
                    return;
                }
                else
                {
                    if (oldValue != MessageValue)
                    {
                        if (MessageBox.Show(this, $"Möchten Sie den Eintrag '{oldValue}' in der Spalte '{header}' sicher zu '{MessageValue}' ändern?", "Sicher ändern?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) == MessageBoxResult.Yes)
                        {
                            switch (header)
                            {
                                case "Name":
                                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Name = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Name = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                {
                                                                    new MySqlParameter("@newValue", newValue),
                                                                    new MySqlParameter("@UserName", Environment.UserName),
                                                                    new MySqlParameter("@id", id)
                                                                });
                                    break;
                                case "Verantw. MA":
                                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Verantwortlicher_MA_Firma = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Verantwortlicher_MA_Firma = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                {
                                                                    new MySqlParameter("@newValue", newValue),
                                                                    new MySqlParameter("@UserName", Environment.UserName),
                                                                    new MySqlParameter("@id", id)
                                                                });
                                    break;
                                case "Tel. Firma":
                                    if (!System.Text.RegularExpressions.Regex.IsMatch(newValue, "^[0-9()+\\-/ ]*$"))
                                    {
                                        MessageBox.Show("Telefonnummer der Firma muss qualifiziert angegeben werden!\nFalls keine Nummer des MA der Firma bekannt, die Nummer des Erstellers eintragen", "Fehler");
                                        break;
                                        //new Popup() { Child = new TextBlock() { Text = $"'{tbTel_Firma.Text.Last()}' ist kein gültiges Zeichen\nTelefonnummer muss qualifiziert eingetragen werden!", Foreground = new SolidColorBrush(Colors.White), Margin = new Thickness(5) }, IsOpen = true, StaysOpen = false, Placement = PlacementMode.Mouse };
                                        //break;
                                    }

                                    if (newValue.ToList<char>().Distinct().Count() < 5)
                                    {
                                        MessageBox.Show("Telefonnummer der Firma muss qualifiziert angegeben werden!\nFalls keine Nummer des MA der Firma bekannt, die Nummer des Erstellers eintragen", "Fehler");
                                        break;
                                    }
                                    else
                                    {
                                        //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Tel_Nr_Verantwortlicher_Firma = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                        await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Tel_Nr_Verantwortlicher_Firma = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                    {
                                                                        new MySqlParameter("@newValue", newValue),
                                                                        new MySqlParameter("@UserName", Environment.UserName),
                                                                        new MySqlParameter("@id", id)
                                                                    });
                                        break;
                                    }
                                case "Anz. Begleitp.":
                                    if (!System.Text.RegularExpressions.Regex.IsMatch(newValue, "^[0-9]*$"))
                                        MessageBox.Show(this, "Anzahl Begleiter darf nur Zahlen enthalten", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                                    else
                                        //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Anzahl_Begleiter = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                        await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Anzahl_Begleiter = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                    {
                                                                        new MySqlParameter("@newValue", newValue),
                                                                        new MySqlParameter("@UserName", Environment.UserName),
                                                                        new MySqlParameter("@id", id)
                                                                    });
                                    break;
                                case "Anz. Fzg.":
                                    if (!System.Text.RegularExpressions.Regex.IsMatch(newValue, "^[0-9]*$"))
                                        MessageBox.Show(this, "Anzahl Fzg. darf nur Zahlen enthalten", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                                    else
                                    {
                                        if (Convert.ToInt16(newValue) > 1 && Convert.ToInt16(newValue) > Convert.ToInt16(System.Text.RegularExpressions.Regex.IsMatch(oldValue, "^[0-9]*$") ? oldValue : oldValue = "0"))
                                        {
                                            //var res = MessageBox.Show(fzgMessage, "Fahrzeuganzahl > 1", MessageBoxButton.YesNoCancel, MessageBoxImage.Exclamation);
                                            XMessageBoxFahrzeugAnzahl msg = new XMessageBoxFahrzeugAnzahl(Convert.ToInt16(oldValue), Convert.ToInt32(id));
                                            msg.ShowDialog();

                                            var res = msg.ResultButton;
                                            var mail = msg.ResultText;

                                            var wunsch = "";
                                            if (MessageBoxResult.Yes == res)
                                            {
                                                wunsch = newValue;
                                                e.Cancel = true;
                                            }
                                            else if (MessageBoxResult.No == res)
                                            {
                                                e.Cancel = true;
                                            }
                                            else
                                            {
                                                e.Cancel = true;
                                                return;
                                            }


                                            if (!string.IsNullOrWhiteSpace(wunsch) && Convert.ToInt16(wunsch) > 1) await SQL.WriteSQL($"REPLACE INTO {MainWindow.table}.fzgAnmeldung (idfirmen,AnzahlFzg,User,Email) VALUES ({id},'{wunsch}','{Environment.UserName}','{(string.IsNullOrWhiteSpace(mail) ? "" : mail)}')");


                                            //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Anzahl_Fzg = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                            await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Anzahl_Fzg = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                        {
                                                                            new MySqlParameter("@newValue", newValue),
                                                                            new MySqlParameter("@UserName", Environment.UserName),
                                                                            new MySqlParameter("@id", id)
                                                                        });

                                            //await SQL.WriteSQL($"UPDATE {MainWindow.table}.fzgAnmeldung SET NotificationSent = '0' WHERE idFirmen = '{id}'");
                                            await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.fzgAnmeldung SET NotificationSent = '0' WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                        {
                                                                            new MySqlParameter("@id", id)
                                                                        });
                                        }
                                        else if (Convert.ToInt16(newValue) <= 1)
                                        {
                                            await SQL.WriteSQL($"DELETE FROM {MainWindow.table}.fzgAnmeldung WHERE idFirmen = {id}");
                                            //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Anzahl_Fzg = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                            await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Anzahl_Fzg = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                        {
                                                                            new MySqlParameter("@newValue", newValue),
                                                                            new MySqlParameter("@UserName", Environment.UserName),
                                                                            new MySqlParameter("@id", id)
                                                                        });
                                        }
                                        else
                                        {
                                            //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Anzahl_Fzg = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                            await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Anzahl_Fzg = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                        {
                                                                            new MySqlParameter("@newValue", newValue),
                                                                            new MySqlParameter("@UserName", Environment.UserName),
                                                                            new MySqlParameter("@id", id)
                                                                        });
                                        }
                                    }
                                    break;
                                case "Beauftragte Leistung":
                                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Beauftragte_Leistung = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Beauftragte_Leistung = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                {
                                                                    new MySqlParameter("@newValue", newValue),
                                                                    new MySqlParameter("@UserName", Environment.UserName),
                                                                    new MySqlParameter("@id", id)
                                                                });
                                    break;
                                case "Arbeitsbeginn":
                                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsbeginn = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsbeginn = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                {
                                                                    new MySqlParameter("@newValue", newValue),
                                                                    new MySqlParameter("@UserName", Environment.UserName),
                                                                    new MySqlParameter("@id", id)
                                                                });

                                    if (Convert.ToDateTime(SQL.ReadSingleValue($"SELECT Arbeitsende FROM {MainWindow.table}.firmen WHERE idFirmen = '{id}'")) < MessageDate)
                                    {
                                        MessageBox.Show(this, "Arbeitsende darf nicht kleiner als Arbeitsbeginn sein\nDatum wird automatisch angepasst", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                                        //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsende = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                        await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsende = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                    {
                                                                        new MySqlParameter("@newValue", newValue),
                                                                        new MySqlParameter("@UserName", Environment.UserName),
                                                                        new MySqlParameter("@id", id)
                                                                    });
                                    }
                                    break;
                                case "Arbeitsende":
                                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsende = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsende = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                {
                                                                    new MySqlParameter("@newValue", newValue),
                                                                    new MySqlParameter("@UserName", Environment.UserName),
                                                                    new MySqlParameter("@id", id)
                                                                });

                                    if (Convert.ToDateTime(SQL.ReadSingleValue($"SELECT Arbeitsbeginn FROM {MainWindow.table}.firmen WHERE idFirmen = '{id}'")) > MessageDate)
                                    {
                                        MessageBox.Show(this, "Arbeitbeginn darf nicht größer als Arbeitsende sein\nDatum wird automatisch angepasst", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                                        //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsbeginn = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                        await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsbeginn = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                    {
                                                                        new MySqlParameter("@newValue", newValue),
                                                                        new MySqlParameter("@UserName", Environment.UserName),
                                                                        new MySqlParameter("@id", id)
                                                                    });
                                    }
                                    break;
                                case "Unterwiesen bis":
                                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Örtliche_Einweisung_bis = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Örtliche_Einweisung_bis = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                {
                                                                    new MySqlParameter("@newValue", newValue),
                                                                    new MySqlParameter("@UserName", Environment.UserName),
                                                                    new MySqlParameter("@id", id)
                                                                });
                                    break;
                                case "Anspr. intern":
                                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Ansprechpartner_Intern = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Ansprechpartner_Intern = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                {
                                                                    new MySqlParameter("@newValue", newValue),
                                                                    new MySqlParameter("@UserName", Environment.UserName),
                                                                    new MySqlParameter("@id", id)
                                                                });
                                    break;
                                case "Tel. Ansprechp.":
                                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Tel_Nr_Ansprechpartner_Intern = '{newValue}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Tel_Nr_Ansprechpartner_Intern = @newValue, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                                {
                                                                    new MySqlParameter("@newValue", newValue),
                                                                    new MySqlParameter("@UserName", Environment.UserName),
                                                                    new MySqlParameter("@id", id)
                                                                });
                                    break;
                            }
                        }
                    }
                }

                index = e.Row.GetIndex();

                dgFirmen.PreviewKeyDown += DgFirmen_PreviewKeyDown;

                dgFirmen.RowValidationErrorTemplate = new ControlTemplate();

                updateList();

                dgFirmen.SelectedIndex = (index);
                dgFirmen.ScrollIntoView(dgFirmen.Items[index]);

            }
            catch (Exception ex)
            {
                Log.WriteLog(ex.ToString());
                MessageBox.Show($"Es ist ein Fehler aufgetreten\n\n{ex.Message}", "Schwerer Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            finally
            {
                timer.Interval = TimeSpan.FromMilliseconds(50);
                timer.Tick += Timer_Tick;
                timer.Start();
            }
        }
        System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();

        private async void Timer_Tick(object sender, EventArgs e)
        {
            await ScrollTo();
            timer.Stop();
        }

        int index = 0;
        private async Task ScrollTo()
        {
            try
            {
                if (added)
                {
                    var max = 0;

                    for (var i = 0; i < dgFirmen.Items.Count; i++)
                    {
                        var j = (int)(dgFirmen.Items[i] as System.Data.DataRowView).Row.ItemArray[0];
                        if (max < j)
                        {
                            max = j;
                            index = i;
                        }
                    }

                    dgFirmen.SelectedIndex = index;
                    dgFirmen.ScrollIntoView(dgFirmen.Items[index], dgFirmen.Columns[0]);

                    added = false;
                }
                else
                {
                    if (index > 0 && dgFirmen.Items.Count >= index)
                    {
                        dgFirmen.SelectedIndex = index;
                        dgFirmen.ScrollIntoView(dgFirmen.Items[index], dgFirmen.Columns[0]);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.WriteLog(ex.ToString());
                MessageBox.Show($"Es ist ein Fehler aufgetreten\n\n{ex.Message}", "Schwerer Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }



        private void BtnEinweisung_PreValues_Click(object sender, RoutedEventArgs e)
        {
            string Value = (sender as Button).Content.ToString();

            if (Value.EndsWith("Jahr"))
                dpEinweisung_Bis.SelectedDate = DateTime.Now.AddYears(1);
            else if (Value.EndsWith("Monat"))
                dpEinweisung_Bis.SelectedDate = DateTime.Now.AddMonths(1);
            else if (Value.EndsWith("Woche"))
                dpEinweisung_Bis.SelectedDate = DateTime.Now.AddDays(7);
            else if (Value.EndsWith("folgt"))
            {
                SetDPText("...Einweisung folgt...");
            }
            else if (Value.EndsWith("Begleitung"))
            {
                SetDPText("...Nur in Begleitung...");
            }
            //Debug.WriteLine(x.ToString());
        }

        private void SetDPText(string Text)
        {
            dpEinweisung_Bis.Text = "";

            System.Reflection.FieldInfo fiTextBox = typeof(DatePicker).GetField("_textBox", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

            if (fiTextBox != null)
            {
                DatePickerTextBox dateTextBox =
                 (DatePickerTextBox)fiTextBox.GetValue(dpEinweisung_Bis);

                if (dateTextBox != null)
                {
                    System.Reflection.PropertyInfo piWatermark = dateTextBox.GetType()
                     .GetProperty("Watermark", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

                    if (piWatermark != null)
                    {
                        piWatermark.SetValue(dateTextBox, Text, null);
                    }
                }
            }
        }

        private string GetDPText()
        {
            System.Reflection.FieldInfo fiTextBox = typeof(DatePicker).GetField("_textBox", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

            if (fiTextBox != null)
            {
                DatePickerTextBox dateTextBox =
                 (DatePickerTextBox)fiTextBox.GetValue(dpEinweisung_Bis);

                if (dateTextBox != null)
                {
                    System.Reflection.PropertyInfo piWatermark = dateTextBox.GetType()
                     .GetProperty("Watermark", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

                    if (piWatermark != null)
                    {
                        return (string)piWatermark.GetValue(dateTextBox, null);
                    }
                }
            }

            return "";
        }

        private void TbBeauftragte_Leistung_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab)
            {
                dpArbeitsbeginn.Focus();
                dpArbeitsbeginn.IsDropDownOpen = true;
            }


            if (e.Key != Key.OemComma)
            {
                e.Handled = false;
                return;
            }
            else
            {
                MessageBox.Show(this, "Komma (',') ist ein nicht erlaubtes Zeichen", "Achtung", MessageBoxButton.OK, MessageBoxImage.Information);
                e.Handled = true;
            }
            return;
        }

        private void DpArbeitsbeginn_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab)
            {
                dpArbeitsbeginn.IsDropDownOpen = false;
                dpArbeitsende.Focus();
                dpArbeitsende.IsDropDownOpen = true;
            }
        }

        private void DpArbeitsende_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab)
            {
                dpArbeitsende.IsDropDownOpen = false;
                dpEinweisung_Bis.Focus();
                dpEinweisung_Bis.IsDropDownOpen = true;
            }
        }

        private void DpEinweisung_Bis_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab)
            {
                dpEinweisung_Bis.IsDropDownOpen = false;
                dpEinweisung_Bis.Focus();
            }
        }


        private void dgFirmen_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dgFirmen.SelectedIndex != -1) btnDelete.IsEnabled = true;
            else btnDelete.IsEnabled = false;

            //ScrollTo();
        }
        private async void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            var dg = dgFirmen;
            var row = dg.SelectedItem as DataRowView;
            var arr = row.Row.ItemArray;

            if (MessageBox.Show(this, $"Markierte Firma '{arr[1]}' wirklich entfernen?", "Firma entfernen?", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes)
            {
                deleteRow(arr);
            }
        }

        private async void deleteRow(object[] arr)
        {
            //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.firmenLog (idfirmen,Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Geloescht_Von) VALUES " +
            //                                            $"('{arr[0]}','{arr[1].ToString()}','{arr[2].ToString()}','{arr[3].ToString()}','{arr[4].ToString()}','{arr[5].ToString()}','{arr[6].ToString()}','{Convert.ToDateTime(arr[7].ToString()).ToString("yyyy-MM-dd")}','{Convert.ToDateTime(arr[8].ToString()).ToString("yyyy-MM-dd")}','{arr[10].ToString()}','{arr[11].ToString()}','{Environment.UserName}')");
            await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.firmenLog (idfirmen,Name,Verantwortlicher_MA_Firma,Tel_Nr_Verantwortlicher_Firma,Anzahl_Begleiter,Anzahl_Fzg,Beauftragte_Leistung,Arbeitsbeginn,Arbeitsende,Ansprechpartner_Intern,Tel_Nr_Ansprechpartner_Intern,Geloescht_Von) VALUES " +
                                                        $"(@idfirmen,@Name,@Verantwortlicher_MA_Firma,@Tel_Nr_Verantwortlicher_Firma,@Anzahl_Begleiter,@Anzahl_Fzg,@Beauftragte_Leistung,@Arbeitsbeginn,@Arbeitsende,@Ansprechpartner_Intern,@Tel_Nr_Ansprechpartner_Intern,@Geloescht_Von)", new List<MySqlParameter>()
                                                        {
                                                            new MySqlParameter("@idfirmen",arr[0]),
                                                            new MySqlParameter("@Name",arr[1].ToString()),
                                                            new MySqlParameter("@Verantwortlicher_MA_Firma",arr[2].ToString()),
                                                            new MySqlParameter("@Tel_Nr_Verantwortlicher_Firma",arr[3].ToString()),
                                                            new MySqlParameter("@Anzahl_Begleiter",arr[4].ToString()),
                                                            new MySqlParameter("@Anzahl_Fzg",arr[5].ToString()),
                                                            new MySqlParameter("@Beauftragte_Leistung", arr[6].ToString()),
                                                            new MySqlParameter("@Arbeitsbeginn", Convert.ToDateTime(arr[7].ToString()).ToString("yyyy-MM-dd")),
                                                            new MySqlParameter("@Arbeitsende", Convert.ToDateTime(arr[8].ToString()).ToString("yyyy-MM-dd")),
                                                            new MySqlParameter("@Ansprechpartner_Intern", arr[10].ToString()),
                                                            new MySqlParameter("@Tel_Nr_Ansprechpartner_Intern", arr[11].ToString()),
                                                            new MySqlParameter("@Geloescht_Von", Environment.UserName)
                                                        });

            await SQL.WriteSQL($"DELETE FROM {MainWindow.table}.firmen WHERE `idFirmen` = '{arr[0]}'");
            await SQL.WriteSQL($"DELETE FROM {MainWindow.table}.fzgAnmeldung WHERE `idFirmen` = '{arr[0]}'");

            updateList();
        }

        private void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            System.Diagnostics.Debug.WriteLine("PropertyChanged   " + propertyName);
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private void TextBoxes_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key != Key.OemComma)
            {
                e.Handled = false;
                return;
            }
            else
            {
                MessageBox.Show(this, "Komma (',') ist ein nicht erlaubtes Zeichen", "Achtung", MessageBoxButton.OK, MessageBoxImage.Information);
                e.Handled = true;
            }
            return;
        }


        string oldValue = "";
        private void dgFirmen_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
        {
            if (e.Column.Header.ToString() == "Anspr. intern")
                oldValue = (e.EditingElement as ComboBox) != null ? (e.EditingElement as ComboBox).Text : "";
            else
                oldValue = (e.EditingElement as TextBox) != null ? (e.EditingElement as TextBox).Text : "";
        }


        private void dg_cbASP_DropDownOpened(object sender, EventArgs e)
        {
            oldValue = (sender as ComboBox) != null ? (sender as ComboBox).Text : "";
        }

        private async void dg_cbAsp_DropDownClosed(object sender, EventArgs e)
        {
            var box = sender as ComboBox;
            DataGridRow dataGridRow = Helper.FindParent<DataGridRow>(box);
            int index = dataGridRow.GetIndex();

            var id = ((System.Data.DataRowView)dataGridRow.DataContext).Row.ItemArray[0];

            if ((sender as ComboBox).SelectedIndex != -1 && (sender as ComboBox).SelectedItem.ToString() != "")
            {
                if (oldValue != box.Text)
                {
                    if (MessageBox.Show(this, $"Möchten Sie den Eintrag '{oldValue}' in der Spalte 'Anspr. intern' sicher zu '{box.Text}' ändern?", "Sicher ändern?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) == MessageBoxResult.Yes)
                    {
                        //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Ansprechpartner_Intern = '{box.Text}',Tel_Nr_Ansprechpartner_Intern = '{SQL.ReadSingleValue($"SELECT Tel_Nr FROM {MainWindow.table}.ansprechpartner WHERE Name = '{(sender as ComboBox).Text}'")}', Bearbeiter = '{Environment.UserName}' WHERE idfirmen = '{id}'");
                        await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Ansprechpartner_Intern = @box,Tel_Nr_Ansprechpartner_Intern = '{SQL.ReadSingleValue($"SELECT Tel_Nr FROM {MainWindow.table}.ansprechpartner WHERE Name = '{(sender as ComboBox).Text}'")}', Bearbeiter = @UserName WHERE idfirmen = @id", new List<MySqlParameter>()
                                                    {
                                                        new MySqlParameter("@box", box.Text),
                                                        new MySqlParameter("@UserName", Environment.UserName),
                                                        new MySqlParameter("@id", id)
                                                    });

                        updateList();


                        dgFirmen.RowValidationErrorTemplate = new ControlTemplate();

                        dgFirmen.SelectedIndex = (index);
                        dgFirmen.ScrollIntoView(dgFirmen.Items[index]);
                    }
                }
            }
            else
            {
                //tbAnsprechp_Intern.Text = "";
                //tbTel_Ansprechp.Text = "";
            }
        }



        private void dg_cbBE_DropDownOpened(object sender, EventArgs e)
        {
            oldValue = (sender as ComboBox) != null ? (sender as ComboBox).Text : "";
        }

        private async void dg_cbBE_DropDownClosed(object sender, EventArgs e)
        {
            var box = sender as ComboBox;
            DataGridRow dataGridRow = Helper.FindParent<DataGridRow>(box);
            int index = dataGridRow.GetIndex();

            var id = ((System.Data.DataRowView)dataGridRow.DataContext).Row.ItemArray[0];

            if ((sender as ComboBox).SelectedIndex != -1 && (sender as ComboBox).SelectedItem.ToString() != "")
            {
                if (oldValue != box.Text)
                {
                    if (MessageBox.Show(this, $"Möchten Sie den Eintrag '{oldValue}' in der Spalte 'BE-Fläche' sicher zu '{box.Text}' ändern?", "Sicher ändern?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) == MessageBoxResult.Yes)
                    {
                        //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET BE = '{box.Text}',BEint = '{box.SelectedIndex}', Bearbeiter = '{Environment.UserName}' WHERE idfirmen = '{id}'");
                        await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET BE = @box,BEint = @box_SelectedIndex, Bearbeiter = @UserName WHERE idfirmen = @id", new List<MySqlParameter>()
                                                    {
                                                        new MySqlParameter("@box", box.Text),
                                                        new MySqlParameter("@box_SelectedIndex", box.Text.Split(' ')[1]),
                                                        new MySqlParameter("@UserName", Environment.UserName),
                                                        new MySqlParameter("@id", id)
                                                    });

                        updateList();


                        dgFirmen.RowValidationErrorTemplate = new ControlTemplate();

                        dgFirmen.SelectedIndex = (index);
                        dgFirmen.ScrollIntoView(dgFirmen.Items[index]);
                    }
                }
            }
            else if ((sender as ComboBox).SelectedIndex != -1 && (sender as ComboBox).SelectedItem.ToString() == "")
            {
                if (oldValue != box.Text)
                {
                    if (MessageBox.Show(this, $"Möchten Sie den Eintrag '{oldValue}' in der Spalte 'BE-Fläche' sicher leeren?", "Sicher ändern?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) == MessageBoxResult.Yes)
                    {
                        //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET BE = '{box.Text}',BEint = '{box.SelectedIndex}', Bearbeiter = '{Environment.UserName}' WHERE idfirmen = '{id}'");
                        await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET BE = @box,BEint = @box_SelectedBE, Bearbeiter = @UserName WHERE idfirmen = @id", new List<MySqlParameter>()
                                                    {
                                                        new MySqlParameter("@box", box.Text),
                                                        new MySqlParameter("@box_SelectedBE", box.Text.Split(' ')[1]),
                                                        new MySqlParameter("@UserName", Environment.UserName),
                                                        new MySqlParameter("@id", id)
                                                    });

                        updateList();


                        dgFirmen.RowValidationErrorTemplate = new ControlTemplate();

                        dgFirmen.SelectedIndex = (index);
                        dgFirmen.ScrollIntoView(dgFirmen.Items[index]);
                    }
                }
            }
        }


        private void btnHelp_Click(object sender, RoutedEventArgs e)
        {
            canvasHelp.Visibility = Visibility.Visible;
        }

        private void btnCloseHelp_Click(object sender, RoutedEventArgs e)
        {
            canvasHelp.Visibility = Visibility.Collapsed;
        }

        private void tbAnzahl_Fzg_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            if ((sender as TextBox).Text.Length >= 2) e.Handled = true;
            if (!System.Text.RegularExpressions.Regex.IsMatch(e.Text, "^[0-9]*$")) e.Handled = true;
        }

        private void tbAnzahl_Begleiter_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            if ((sender as TextBox).Text.Length >= 2) e.Handled = true;
            if (!System.Text.RegularExpressions.Regex.IsMatch(e.Text, "^[0-9]*$")) e.Handled = true;
        }

        private void Textboxes_PreviewExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            if (e.Command == ApplicationCommands.Paste)
            {
                e.Handled = true;
            }
        }

        private void tbTel_Nr_Ansprechpartner_Intern_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            if (Helper.OverMaxLength((sender as TextBox).Text, 45))
            {
                e.Handled = true;
                MessageBox.Show("Maximal 45 Zeichen!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void dpArbeitsbeginn_DateValidationError(object sender, DatePickerDateValidationErrorEventArgs e)
        {
            MessageBox.Show("Kein gültiges Datumsformat in Feld 'Arbeitsbeginn'", "Fehler", MessageBoxButton.OK, MessageBoxImage.Warning);
        }

        private void dpEinweisung_Bis_DateValidationError(object sender, DatePickerDateValidationErrorEventArgs e)
        {
            MessageBox.Show("Kein gültiges Datumsformat in Feld 'Einweisung bis'", "Fehler", MessageBoxButton.OK, MessageBoxImage.Warning);
        }

        private void dpArbeitsende_DateValidationError(object sender, DatePickerDateValidationErrorEventArgs e)
        {
            MessageBox.Show("Kein gültiges Datumsformat in Feld 'Arbeitsende'", "Fehler", MessageBoxButton.OK, MessageBoxImage.Warning);
        }









        private void TextBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            oldValue = (sender as TextBox).Text;
        }

        private async void TextBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            var textBoxes = Helper.FindVisualChildren<TextBox>(dgFirmen).Where(tb => tb.Name == "tbdgAnzBegleit");

            foreach (var textBox in textBoxes)
            {
                textBox.LostKeyboardFocus -= TextBox_LostKeyboardFocus;
                textBox.GotKeyboardFocus -= TextBox_GotKeyboardFocus;
            }

            if (oldValue != (sender as TextBox).Text && !string.IsNullOrWhiteSpace((sender as TextBox).Text))
            {
                if (MessageBox.Show(this, $"Möchten Sie den Eintrag '{oldValue}' in der Spalte 'Anz. Begleitp.' sicher zu '{(sender as TextBox).Text}' ändern?", "Sicher ändern?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    var tb = sender as TextBox;
                    DataGridRow dataGridRow = Helper.FindParent<DataGridRow>(tb);
                    int index = dataGridRow.GetIndex();

                    var id = (DataGridRow.GetRowContainingElement((sender as TextBox)).Item as DataRowView).Row.ItemArray[0];
                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsbeginn = '{(sender as DatePicker).SelectedDate.Value.ToString("yyyy-MM-dd")}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Anzahl_Begleiter = @AnzBegleit, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                    {
                                                        new MySqlParameter("@AnzBegleit", (sender as TextBox).Text),
                                                        new MySqlParameter("@UserName", Environment.UserName),
                                                        new MySqlParameter("@id", id)
                                                    });
                }
                else (sender as TextBox).Text = oldValue;
            }

            foreach (var textBox in textBoxes)
            {
                textBox.LostKeyboardFocus += TextBox_LostKeyboardFocus;
                textBox.GotKeyboardFocus += TextBox_GotKeyboardFocus;
            }
        }

        private void dpDataGridArbeitsbeginn_CalendarOpened(object sender, RoutedEventArgs e)
        {
            oldValue = (sender as DatePicker).Text;
        }

        private async void dpDataGridArbeitsbeginn_CalendarClosed(object sender, RoutedEventArgs e)
        {
            try
            {

                if (oldValue != (sender as DatePicker).Text && (sender as DatePicker).SelectedDate.HasValue)
                {
                    if (MessageBox.Show(this, $"Möchten Sie den Eintrag '{oldValue}' in der Spalte 'Arbeitsbeginn' sicher zu '{(sender as DatePicker).Text}' ändern?", "Sicher ändern?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) == MessageBoxResult.Yes)
                    {
                        var dp = sender as DatePicker;
                        DataGridRow dataGridRow = Helper.FindParent<DataGridRow>(dp);
                        int index = dataGridRow.GetIndex();

                        var id = (DataGridRow.GetRowContainingElement((sender as DatePicker)).Item as DataRowView).Row.ItemArray[0];
                        //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsbeginn = '{(sender as DatePicker).SelectedDate.Value.ToString("yyyy-MM-dd")}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                        await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsbeginn = @Date, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                    {
                                                        new MySqlParameter("@Date", (sender as DatePicker).SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                        new MySqlParameter("@UserName", Environment.UserName),
                                                        new MySqlParameter("@id", id)
                                                    });


                        if (Convert.ToDateTime(SQL.ReadSingleValue($"SELECT Arbeitsende FROM {MainWindow.table}.firmen WHERE idFirmen = '{id}'")) < (sender as DatePicker).SelectedDate.Value)
                        {
                            MessageBox.Show(this, "Arbeitsende darf nicht kleiner als Arbeitsbeginn sein\nDatum wird automatisch angepasst", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                            //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsende = '{(sender as DatePicker).SelectedDate.Value.ToString("yyyy-MM-dd")}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                            await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsende = @Date, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                        {
                                                            new MySqlParameter("@Date", (sender as DatePicker).SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                            new MySqlParameter("@UserName", Environment.UserName),
                                                            new MySqlParameter("@id", id)
                                                        });
                        }

                        updateList();

                        dgFirmen.SelectedIndex = (index);
                        dgFirmen.ScrollIntoView(dgFirmen.Items[index]);
                    }
                    else (sender as DatePicker).SelectedDate = Convert.ToDateTime(oldValue);
                }
            }
            catch (Exception ex)
            {
                Log.WriteLog(ex.ToString());
            }
        }

        private void dpDataGridArbeitsende_CalendarOpened(object sender, RoutedEventArgs e)
        {
            oldValue = (sender as DatePicker).Text;
        }

        private async void dpDataGridArbeitsende_CalendarClosed(object sender, RoutedEventArgs e)
        {
            try
            {

                if (oldValue != (sender as DatePicker).Text && (sender as DatePicker).SelectedDate.HasValue)
                {
                    if (MessageBox.Show(this, $"Möchten Sie den Eintrag '{oldValue}' in der Spalte 'Arbeitsende' sicher zu '{(sender as DatePicker).Text}' ändern?", "Sicher ändern?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) == MessageBoxResult.Yes)
                    {
                        var dp = sender as DatePicker;
                        DataGridRow dataGridRow = Helper.FindParent<DataGridRow>(dp);
                        int index = dataGridRow.GetIndex();

                        var id = (DataGridRow.GetRowContainingElement((sender as DatePicker)).Item as DataRowView).Row.ItemArray[0];
                        //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsende = '{(sender as DatePicker).SelectedDate.Value.ToString("yyyy-MM-dd")}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                        await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsende = @Date, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                    {
                                                        new MySqlParameter("@Date", (sender as DatePicker).SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                        new MySqlParameter("@UserName", Environment.UserName),
                                                        new MySqlParameter("@id", id)
                                                    });

                        if (Convert.ToDateTime(SQL.ReadSingleValue($"SELECT Arbeitsbeginn FROM {MainWindow.table}.firmen WHERE idFirmen = '{id}'")) > (sender as DatePicker).SelectedDate.Value)
                        {
                            MessageBox.Show(this, "Arbeitsbeginn darf nicht größer als Arbeitsende sein\nDatum wird automatisch angepasst", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                            //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsbeginn = '{(sender as DatePicker).SelectedDate.Value.ToString("yyyy-MM-dd")}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                            await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Arbeitsbeginn = @Date, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                        {
                                                            new MySqlParameter("@Date", (sender as DatePicker).SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                            new MySqlParameter("@UserName", Environment.UserName),
                                                            new MySqlParameter("@id", id)
                                                        });
                        }

                        updateList();

                        dgFirmen.SelectedIndex = (index);
                        dgFirmen.ScrollIntoView(dgFirmen.Items[index]);
                    }
                    else
                    {
                        DateTime result = DateTime.Now;
                        var date = DateTime.TryParse(oldValue, out result);

                        if (date)
                            (sender as DatePicker).SelectedDate = result;
                        else MessageBox.Show("Fehlerhaftes Datum gewählt", "Fehlerhaftes Datum", MessageBoxButton.OK, MessageBoxImage.Error);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.WriteLog(ex.ToString());
            }
        }

        private void dpDataGridEinweisung_CalendarOpened(object sender, RoutedEventArgs e)
        {
            oldValue = (sender as DatePicker).Text;
        }

        private async void dpDataGridEinweisung_CalendarClosed(object sender, RoutedEventArgs e)
        {
            if (oldValue != (sender as DatePicker).Text)
            {
                var newValue = (sender as DatePicker).Text;

                switch ((sender as DatePicker).Text)
                {
                    case "01.01.1902":
                        newValue = "Einweisung folgt";
                        break;
                    case "01.01.1903":
                        newValue = "Nur in Begleitung";
                        break;
                }

                if (MessageBox.Show(this, $"Möchten Sie den Eintrag '{oldValue}' in der Spalte 'Einweisung bis' sicher zu '{newValue}' ändern?", "Sicher ändern?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    var dp = sender as DatePicker;
                    DataGridRow dataGridRow = Helper.FindParent<DataGridRow>(dp);
                    int index = dataGridRow.GetIndex();

                    var id = (DataGridRow.GetRowContainingElement((sender as DatePicker)).Item as DataRowView).Row.ItemArray[0];
                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Örtliche_Einweisung_bis = '{(sender as DatePicker).SelectedDate.Value.ToString("yyyy-MM-dd")}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");
                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.firmen SET Örtliche_Einweisung_bis = @Date, Bearbeiter = @UserName WHERE idFirmen = @id", new List<MySqlParameter>()
                                                {
                                                    new MySqlParameter("@Date", (sender as DatePicker).SelectedDate.Value.ToString("yyyy-MM-dd")),
                                                    new MySqlParameter("@UserName", Environment.UserName),
                                                    new MySqlParameter("@id", id)
                                                });


                    updateList();

                    dgFirmen.SelectedIndex = (index);
                    dgFirmen.ScrollIntoView(dgFirmen.Items[index]);
                }
                else (sender as DatePicker).SelectedDate = Convert.ToDateTime(oldValue);
            }
        }
        //private async void TelNrVerantwortlicher_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        //{
        //    if (oldValue != (sender as TextBox).Text)
        //    {
        //        if (MessageBox.Show(this, $"Möchten Sie den Eintrag '{oldValue}' in der Spalte 'Tel. Firma' sicher zu '{(sender as TextBox).Text}' ändern?", "Sicher ändern?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) == MessageBoxResult.Yes)
        //        {
        //            var dp = sender as TextBox;
        //            DataGridRow dataGridRow = Helper.FindParent<DataGridRow>(dp);
        //            int index = dataGridRow.GetIndex();

        //            var id = (DataGridRow.GetRowContainingElement((sender as TextBox)).Item as DataRowView).Row.ItemArray[0];
        //            await SQL.WriteSQL($"UPDATE {MainWindow.table}.firmen SET Tel_Nr_Verantwortlicher_Firma = '{(sender as TextBox).Text}', Bearbeiter = '{Environment.UserName}' WHERE idFirmen = '{id}'");

        //            updateList();

        //            dgFirmen.SelectedIndex = (index);
        //            dgFirmen.ScrollIntoView(dgFirmen.Items[index]);
        //        }
        //        else (sender as TextBox).Text = oldValue;
        //    }
        //}


        private void btnDpDgEinweisung_ToolTipOpening(object sender, ToolTipEventArgs e)
        {
            string unit = "";
            string date = "";

            switch ((sender as Button).Name)
            {
                case "btnDpDgEinweisungWoche":
                    unit = "Woche";
                    date = DateTime.Now.Date.AddDays(7).ToShortDateString();
                    break;
                case "btnDpDgEinweisungMonat":
                    unit = "Monat";
                    date = DateTime.Now.Date.AddMonths(1).ToShortDateString();
                    break;
                case "btnDpDgEinweisungJahr":
                    unit = "Jahr";
                    date = DateTime.Now.Date.AddYears(1).ToShortDateString();
                    break;
                default:
                    unit = "Woche";
                    date = DateTime.Now.Date.AddDays(7).ToShortDateString();
                    break;
            }

            (sender as Button).ToolTip = $"Setzt das Einweisungsdatum auf Heute + 1 {unit} ({date})";
        }

        private void btnDpDgEinweisung_Click(object sender, RoutedEventArgs e)
        {
            var btn = sender as Button;
            DataGridRow dataGridRow = Helper.FindParent<DataGridRow>(btn);
            var dp = (dgFirmen.Columns[8].GetCellContent(dataGridRow) as ContentPresenter).ContentTemplate.FindName("dpDataGridEinweisung", (dgFirmen.Columns[8].GetCellContent(dataGridRow) as ContentPresenter)) as DatePicker;
            oldValue = dp.Text;

            switch (btn.Name)
            {
                case "btnDpDgEinweisungWoche":
                    dp.SelectedDate = DateTime.Now.Date.AddDays(7);
                    break;
                case "btnDpDgEinweisungMonat":
                    dp.SelectedDate = DateTime.Now.Date.AddMonths(1);
                    break;
                case "btnDpDgEinweisungJahr":
                    dp.SelectedDate = DateTime.Now.Date.AddYears(1);
                    break;
                case "btnDpDgEinweisungFolgt":
                    dp.SelectedDate = DateTime.Parse("01.01.1902");
                    break;
                case "btnDpDgEinweisungBegleitung":
                    dp.SelectedDate = DateTime.Parse("01.01.1903");
                    break;
                default:
                    dp.SelectedDate = DateTime.Now.Date.AddDays(7);
                    break;
            }


            dpDataGridEinweisung_CalendarClosed(dp, null);
        }

        string searchTerm = "";
        private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (searchTerm == "")
            {
                lblSearch.Visibility = Visibility.Visible;
                searchProgress.Visibility = Visibility.Visible;
            }
            else
            {
                lblSearch.Visibility = Visibility.Collapsed;
                searchProgress.Visibility = Visibility.Visible;
            }

            searchTerm = (sender as TextBox).Text;
            searchTimer.Start();
            //SearchTimer_Tick(null, null);
        }
        private void SearchTimer_Tick(object sender, EventArgs e)
        {
            if (searchTerm == "")
            {
                firmen.DefaultView.RowFilter = $"";

                //Task.Run(() => FirmaView = Firma.DataTableToFirma(firmen));
                //dgFirmen.DataContext = firmen;
            }
            else if (searchTerm.Length < 6)
            {
                firmen.DefaultView.RowFilter = $"Name LIKE '%{searchTerm}%' OR Verantwortlicher_MA_Firma LIKE '%{searchTerm}%'";
                //dgFirmen.DataContext = firmen;
            }
            else
            {
                List<string> similarities = new List<string>();

                foreach (var item in firmen.Rows)
                {
                    var ratio = Fuzz.Ratio(tbSearch.Text.ToLower(), (item as DataRow).ItemArray[1].ToString().ToLower());
                    if (ratio > 70) Debug.WriteLine(ratio, (item as DataRow).ItemArray[1].ToString().ToLower());

                    if (ratio > 70)
                        similarities.Add((item as DataRow).ItemArray[1].ToString());

                    ratio = Fuzz.Ratio(tbSearch.Text.ToLower(), (item as DataRow).ItemArray[2].ToString().ToLower());
                    if (ratio > 70)
                        similarities.Add((item as DataRow).ItemArray[2].ToString());

                    ratio = Fuzz.Ratio(tbSearch.Text.ToLower(), (item as DataRow).ItemArray[6].ToString().ToLower());
                    if (ratio > 70)
                        similarities.Add((item as DataRow).ItemArray[6].ToString());
                }

                StringBuilder str = new StringBuilder();
                str.Append($"Name LIKE '%");

                if (similarities.Count > 0)
                {
                    foreach (var s in similarities)
                        str.Append($"{s}%' OR Name LIKE '%");

                    str.Remove(str.Length - 16, 16);


                    str.Append(" OR Verantwortlicher_MA_Firma LIKE '%");

                    foreach (var s in similarities)
                        str.Append($"{s}%' OR Ansprechpartner_Intern LIKE '%");

                    str.Remove(str.Length - 34, 34);


                    str.Append(" OR Beauftragte_Leistung LIKE '%");

                    foreach (var s in similarities)
                        str.Append($"{s}%' OR Beauftragte_Leistung LIKE '%");

                    str.Remove(str.Length - 31, 31);



                    firmen.DefaultView.RowFilter = str.ToString();

                    //dgFirmen.DataContext = firmen;
                }
                else
                {
                    firmen.DefaultView.RowFilter = $"Name LIKE '%{searchTerm}%' OR Verantwortlicher_MA_Firma LIKE '%{searchTerm}%'";
                    //dgFirmen.DataContext = new DataTable();
                }
            }

            searchProgress.Visibility = Visibility.Collapsed;
            searchTimer.Stop();
        }

        private void tbTel_Firma_PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            if (!System.Text.RegularExpressions.Regex.IsMatch(e.Text, "^[0-9()+\\-/ ]*$"))
            {
                e.Handled = true;
                new Popup() { Child = new TextBlock() { Text = $"'{e.Text}' ist kein gültiges Zeichen\nTelefonnummer muss qualifiziert eingetragen werden!", Foreground = new SolidColorBrush(Colors.White), Margin = new Thickness(5) }, IsOpen = true, StaysOpen = false, Placement = PlacementMode.Mouse };
            }
        }


        private async void btnBegleiter_Click(object sender, RoutedEventArgs e)
        {
            AddFirmenList aFl = new AddFirmenList(false, 0, !string.IsNullOrWhiteSpace(tbAnzahl_Begleiter.Text) ? Convert.ToInt32(tbAnzahl_Begleiter.Text) : 0);
            aFl.ShowDialog();

            if (aFl.DialogResult.Value)
            {
                Personen = aFl.Personen;
                TelNr = aFl.TelNr;
            }
        }



        ToolTip tt = new ToolTip();
        private void tbName_TextChanged(object sender, TextChangedEventArgs e)
        {
            existingFirmenTimer.Stop();
            existingFirmenTimer.Start();

        }

        private void ExistingFirmenTimer_Tick(object sender, EventArgs e)
        {
            ShowExistingFirmen();
            existingFirmenTimer.Stop();
        }

        private void ShowExistingFirmen()
        {

            if (tbName.Text.ToLower().StartsWith("fa") || tbName.Text.ToLower().StartsWith("firma"))
            {
                tt.Placement = PlacementMode.RelativePoint;
                tt.PlacementTarget = tbName;
                tt.HorizontalOffset = tbName.Width * .75;
                //tt.VerticalOffset = -(tbName.Height + tt.ActualHeight);
                tt.Width = tbName.Width * 1.5;
                tt.Background = new SolidColorBrush(Colors.Red);
                //tt.StaysOpen = false;
                tt.Content = new Grid();
                (tt.Content as Grid).Background = new SolidColorBrush(Colors.DarkBlue);
                (tt.Content as Grid).Children.Add(new StackPanel());
                ((tt.Content as Grid).Children[0] as StackPanel).Children.Add(new TextBlock()
                {
                    Text = "Firmen bitte nicht mit Firma oder Fa. oder ähnlichem Präfix eintragen\n" +
                    "Dies dient der Übersichtlichkeit, va. für den Pförtner\n" +
                    "Beispiele:\n\n" +
                    "DB Fernverkehr\n" +
                    "DB Fernverkehr AG\n" +
                    "Maler Müller\n\n" +
                    "Schlechte Eintragung:\n" +
                    "Fa. Maler Müller\n" +
                    "Firma DB Fernverkehr"
                });

                tt.IsOpen = true;

                return;
            }

            List<Tuple<int, string>> similarities = new List<Tuple<int, string>>();

            foreach (var item in firmenSearchList)
            {
                if (item.Value.Count > 0)
                {
                    foreach (var val in item.Value)
                    {
                        var ratio = Fuzz.Ratio(tbName.Text.ToLower(), val.ToLower());
                        if (ratio > 80)
                            similarities.Add(new Tuple<int, string>(ratio, item.Key));
                        else if (!string.IsNullOrWhiteSpace(tbName.Text) && val.ToLower().StartsWith(tbName.Text.ToLower()))
                            similarities.Add(new Tuple<int, string>(50, val));
                    }
                }
                else if (Fuzz.Ratio(tbName.Text.ToLower(), item.Key.ToLower()) > 80)
                    similarities.Add(new Tuple<int, string>(100, item.Key));
                else if (!string.IsNullOrWhiteSpace(tbName.Text) && item.Key.ToLower().StartsWith(tbName.Text.ToLower()))
                    similarities.Add(new Tuple<int, string>(65, item.Key));
            }

            similarities = similarities.OrderByDescending(p => p.Item1).ToList();

            if (similarities.Count > 0)
            {
                tt.Placement = PlacementMode.RelativePoint;
                tt.PlacementTarget = tbName;
                tt.HorizontalOffset = tbName.Width * .75;
                //tt.VerticalOffset = -(tbName.Height + tt.ActualHeight);
                tt.Width = tbName.Width * 1.5;
                tt.Background = new SolidColorBrush(Colors.Red);
                //tt.StaysOpen = false;
                tt.Content = new Grid();
                (tt.Content as Grid).Background = new SolidColorBrush(Colors.Red);
                (tt.Content as Grid).Children.Add(new StackPanel());
                ((tt.Content as Grid).Children[0] as StackPanel).Children.Add(new TextBlock()
                {
                    Text = "Firmen nicht doppelt anlegen!\n\n" +
                    "Firma schon vorhanden und nicht für mehrere verschiedene Maßnahmen gleichzeitig vor Ort?\n" +
                    "-> Bitte den vorhandenen Eintrag anpassen\n\nMeinen Sie:\n"
                });

                foreach (var item in similarities.Select(p => p.Item2).Distinct())
                    ((tt.Content as Grid).Children[0] as StackPanel).Children.Add(new TextBlock() { Text = Helper.FirstCharToUpperCase(item) });

                tt.IsOpen = true;
                tbName.ToolTip = tt;
            }
            else
            {
                tt.IsOpen = false;
                tbName.ToolTip = tt;
            }
        }

        private void Window_Closing(object sender, CancelEventArgs e)
        {
            tt.IsOpen = false;
        }

        private void tbName_LostFocus(object sender, RoutedEventArgs e)
        {
            tt.IsOpen = false;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            dgFirmen.SelectionChanged += dgFirmen_SelectionChanged;


            this.LocationChanged -= Window_LocationChanged;
            Helper.CheckWindowIsInScreenSpace(this);
            this.LocationChanged += Window_LocationChanged;
        }



        private void Window_LocationChanged(object sender, EventArgs e)
        {
            this.LocationChanged -= Window_LocationChanged;
            Helper.CheckWindowIsInScreenSpace(this);
            this.LocationChanged += Window_LocationChanged;
        }


        private async void btnEdit_Click(object sender, RoutedEventArgs e)
        {
            var row = ((Helper.FindParent<ContentPresenter>((sender as Button).Parent as StackPanel)).Content as DataRowView).Row.ItemArray;


            AddFirmenList aFl = new AddFirmenList(true, (int)row[0], Convert.ToInt32(row[4]));
            aFl.ShowDialog();

            updateList();
        }


        private void cbBE_MouseEnter(object sender, MouseEventArgs e)
        {
            if (MainWindow.LoggedInRole == Roles.M2 || MainWindow.LoggedInRole == Roles.M2_AM || MainWindow.LoggedInRole == Roles.Admin)
            {
                if ((cbBE.Items).Count > 0)
                {
                    M2WithGebuchterBETooltipPopup.PlacementTarget = sender as Grid;
                    M2WithGebuchterBETooltipPopup.Placement = PlacementMode.Mouse;
                    //M2WithGebuchterBETooltipPopup.IsOpen = true;

                    // Popup-Zustand komplett zurücksetzen
                    M2WithGebuchterBETooltipPopup.IsOpen = false;
                    M2WithGebuchterBETooltipPopup.UpdateLayout();

                    // Nach dem nächsten Layout-Zyklus öffnen
                    Dispatcher.BeginInvoke(new Action(() =>
                    {
                        if (IsMouseOver) // Prüfen ob Maus noch da ist
                        {
                            M2WithGebuchterBETooltipPopup.IsOpen = true;
                            
                            popCloseTimer.Start();
                        }
                    }), DispatcherPriority.Input);

                }
                else
                {
                    M2WithoutGebuchterBETooltipPopup.PlacementTarget = sender as Grid;
                    M2WithoutGebuchterBETooltipPopup.Placement = PlacementMode.Mouse;
                    //M2WithoutGebuchterBETooltipPopup.IsOpen = true;
                    // Popup-Zustand komplett zurücksetzen
                    M2WithoutGebuchterBETooltipPopup.IsOpen = false;
                    M2WithoutGebuchterBETooltipPopup.UpdateLayout();

                    // Nach dem nächsten Layout-Zyklus öffnen
                    Dispatcher.BeginInvoke(new Action(() =>
                    {
                        if (IsMouseOver) // Prüfen ob Maus noch da ist
                        {
                            M2WithoutGebuchterBETooltipPopup.IsOpen = true;

                            popCloseTimer.Start();
                        }
                    }), DispatcherPriority.Input);
                }
            }
            else
            {
                NotM2TooltipPopup.PlacementTarget = sender as Grid;
                NotM2TooltipPopup.Placement = PlacementMode.Mouse;
                NotM2TooltipPopup.IsOpen = true;
            }
        }

        private void TooltipPopup_Closed(object sender, EventArgs e)
        {
            popCloseTimer.Stop();
        }
    }

    //public class Firma
    //{
    //    public string Name;
    //    string Verantwortlicher_MA_Firma;
    //    string Tel_Nr_Verantwortlicher_Firma;
    //    string Anzahl_Begleiter;
    //    string Anzahl_Fzg;
    //    string Beauftragte_Leistung;
    //    string Arbeitsbeginn;
    //    string Arbeitsende;
    //    string Örtliche_Einweisung_bis;
    //    string Ansprechpartner_Intern;
    //    string Tel_Nr_Ansprechpartner_Intern;




    //    public static List<Firma> DataTableToFirma(System.Data.DataTable dataTable)
    //    {
    //        List<Firma> x = new List<Firma>();

    //        foreach (DataRow dr in dataTable.Rows)
    //        {
    //            x.Add(new Firma()
    //            {
    //                Name = dr[1].ToString(),
    //                Verantwortlicher_MA_Firma = dr[2].ToString(),
    //                Tel_Nr_Verantwortlicher_Firma = dr[3].ToString(),
    //                Anzahl_Begleiter = dr[4].ToString(),
    //                Anzahl_Fzg = dr[5].ToString(),
    //                Beauftragte_Leistung = dr[6].ToString(),
    //                Arbeitsbeginn = dr[7].ToString(),
    //                Arbeitsende = dr[8].ToString(),
    //                Örtliche_Einweisung_bis = dr[9].ToString(),
    //                Ansprechpartner_Intern = dr[10].ToString(),
    //                Tel_Nr_Ansprechpartner_Intern = dr[11].ToString()
    //            });
    //        }

    //        return x;
    //    }
    //}
}
