using ControlzEx.Standard;
using FuzzySharp;
using MahApps.Metro.Controls;
using MySql.Data.MySqlClient;
using MySqlX.XDevAPI.Common;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
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;

namespace ZKuP
{
    /// <summary>
    /// Interaktionslogik für Delivery.xaml
    /// </summary>
    public partial class Delivery : MetroWindow
    {
        public static int GesamtFzg = 42;
        public static int LKWLang = 11;
        public static int LKW = 10;
        public static int Sprinter = 5;
        public static int PKW = 2;


        public static int MaxLKWLang = 2;
        public static int MaxLKW = 3;
        public static int MaxSprinter = 4;
        public static int MaxPKW = 4;


        Dictionary<string, int> EmergencyParkList = new Dictionary<string, int>()
        {
            { "Netz", 6 },
            {"DB Netz",6 },
            {"DB InfraGo",6},
            {"InfraGo",6 },
            {"Energie",7 },
            {"DB Energie",7 }
        };


        //string query = "";

        byte[] _signature = null;
        bool _emergency = false;
        bool noMoreDeliveries = false;

        const string zuViele = "Es sind bereits zu viele Fahrzeuge im Werk";

        public Delivery(bool Emergency = false)
        {
            InitializeComponent();

            _emergency = Emergency;
            tbFilter.Focus();

            if (_emergency)
            {
                tbFilter.Visibility = Visibility.Collapsed;
                btnFiltern.Visibility = Visibility.Collapsed;
                lblFiltern.Visibility = Visibility.Collapsed;
                lblHinterlegt.Text = "DB Firma wählen:";
                tbFirma.IsEnabled = false;

                Grid.SetRow(spLieferfirma, 0);
                spEntstoerdienst.Visibility = Visibility.Visible;

                btnAddLKW.Visibility = Visibility.Collapsed;
                btnAddLKWLang.Visibility = Visibility.Collapsed;
                btnAddSprinter.Visibility = Visibility.Collapsed;

                btnAddPKW.HorizontalAlignment = HorizontalAlignment.Stretch;
                ((btnAddPKW.Content as StackPanel).Children[1] as TextBlock).Text = this.Title = "DB Entstördienst";
                
                Grid.SetColumnSpan(btnAddPKW, 4);
                Grid.SetColumn(btnAddPKW, 0);
                //var list = SQL.ReadListStringTwoColumns($"SELECT Firma, Fahrer FROM {MainWindow.table}.lieferanten WHERE Firma LIKE 'DB%'", "  Fahrer: ").Result;
                //list = list.OrderBy(p => p).ToList();
                //cBLieferfirma.ItemsSource = list;

                //var list = SQL.ReadListStringMultipleColumns($"SELECT Firma, Fahrer, Kennzeichen, ID FROM {MainWindow.table}.lieferanten WHERE Firma LIKE 'DB%'", 4, "      Fahrer: ", "        Kennz.: ", "      ID: ").Result;
                //var list = SQL.ReadListStringMultipleColumns($"SELECT Firma, Fahrer, Kennzeichen, ID FROM {MainWindow.table}.lieferanten WHERE Firma LIKE 'DB%'", 4, "      Fahrer: ", "        Kennz.: ", "      ID: ").Result;

                var list = new List<Lieferant>()
                {
                    new Lieferant() { Firma = "DB Energie" },
                    new Lieferant() { Firma = "DB InfraGO" },
                    new Lieferant() { Firma = "DB KT" },
                    new Lieferant() { Firma = "DB Postservice" },
                    new Lieferant() { Firma = "Gerätewagen" }
                };

                list = list.OrderBy(p => p.Firma).ToList();
                cBLieferfirma.ItemsSource = list;
            }
            else
            {
                //var list = SQL.ReadListStringMultipleColumns($"SELECT Firma, Fahrer, Kennzeichen, ID FROM {MainWindow.table}.lieferanten WHERE Firma NOT LIKE 'DB%'", 4, "      Fahrer: ", "        Kennz.: ", "      ID: ").Result;
                //list = list.OrderBy(p => p).ToList();

                var list = SQL.ReadSQL($"SELECT Firma, Fahrer, Kennzeichen, ID, Handynr FROM {MainWindow.table}.lieferanten WHERE Firma NOT LIKE 'DB%' ORDER BY Firma ASC").Result;
                var items = from DataRow row in list.Rows
                            select new Lieferant
                            {
                                ID = row["ID"].ToString(),
                                Firma = row["Firma"].ToString(),
                                Fahrer = row["Fahrer"].ToString(),
                                Kennzeichen = row["Kennzeichen"].ToString(),
                                Telefon = row["Handynr"].ToString()
                            };

                cBLieferfirma.ItemsSource = items;
                

                var imWerk = SQL.ReadListStringMultipleColumns($"SELECT * FROM {MainWindow.table}.fahrzeuge", 4).Result.First().Split(';');
                // Konfiguration

                // Aktueller Stand
                int AnzahlLKWLangAufGelände = Convert.ToInt16(imWerk[3]);
                int AnzahlLKWAufGelände = Convert.ToInt16(imWerk[0]);
                int AnzahlSprinterAufGelände = Convert.ToInt16(imWerk[1]);
                int AnzahlPKWAufGelände = Convert.ToInt16(imWerk[2]);

                var all = (AnzahlLKWAufGelände * LKW) + (AnzahlSprinterAufGelände * Sprinter) + (AnzahlPKWAufGelände * PKW) + (AnzahlLKWLangAufGelände * LKWLang);

                // Verfügbare Punkte
                int freiePunkte = GesamtFzg - all;

                // Dynamische Erhöhung der erlaubten Einfahrten:
                int erlaubteLKW = MaxLKW + (MaxLKWLang - AnzahlLKWLangAufGelände); // LKW darf mehr, wenn weniger LKWLang
                int erlaubteSprinter = MaxSprinter + (MaxLKW - AnzahlLKWAufGelände); // Sprinter darf mehr, wenn weniger LKW < 40t

                // Was darf noch einfahren?
                bool kannPKW = AnzahlPKWAufGelände < MaxPKW && freiePunkte >= PKW;
                bool kannSprinter = AnzahlSprinterAufGelände < erlaubteSprinter && freiePunkte >= Sprinter;
                bool kannLKW = AnzahlLKWAufGelände < erlaubteLKW && freiePunkte >= LKW;
                bool kannLKWLang = AnzahlLKWLangAufGelände < MaxLKWLang && freiePunkte >= LKWLang;

                // Ausgabe oder Steuerung
                if (!kannPKW && !kannSprinter && !kannLKW && !kannLKWLang)
                {
                    MessageBox.Show("Es können keine Lieferanten mehr eingelassen werden, da sich bereits zu viele Fahrzeuge im Werk befinden", "Kein Einlass!", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                    noMoreDeliveries = true;

                    btnAddLKWLang.IsEnabled = false;
                    btnAddLKWLang.ToolTip = zuViele;

                    btnAddLKW.IsEnabled = false;
                    btnAddLKW.ToolTip = zuViele;

                    btnAddSprinter.IsEnabled = false;
                    btnAddSprinter.ToolTip = zuViele;

                    btnAddPKW.IsEnabled = false;
                    btnAddPKW.ToolTip = zuViele;
                }
                else
                {
                    if (kannPKW) 
                    {
                        btnAddLKWLang.IsEnabled = false;
                        btnAddLKWLang.ToolTip = zuViele;

                        btnAddLKW.IsEnabled = false;
                        btnAddLKW.ToolTip = zuViele;

                        btnAddSprinter.IsEnabled = false;
                        btnAddSprinter.ToolTip = zuViele;

                        btnAddPKW.IsEnabled = true;
                        btnAddPKW.ToolTip = null;
                    }
                    if (kannSprinter) 
                    {
                        btnAddLKWLang.IsEnabled = false;
                        btnAddLKWLang.ToolTip = zuViele;

                        btnAddLKW.IsEnabled = false;
                        btnAddLKW.ToolTip = zuViele;

                        btnAddSprinter.IsEnabled = true;
                        btnAddSprinter.ToolTip = null;

                        btnAddPKW.IsEnabled = true;
                        btnAddPKW.ToolTip = null;
                    }

                    if (kannLKW) 
                    {
                        btnAddLKWLang.IsEnabled = false;
                        btnAddLKWLang.ToolTip = zuViele;

                        btnAddLKW.IsEnabled = true;
                        btnAddLKW.ToolTip = null;

                        btnAddSprinter.IsEnabled = true;
                        btnAddSprinter.ToolTip = null;

                        btnAddPKW.IsEnabled = true;
                        btnAddPKW.ToolTip = null;
                    }

                    if (kannLKWLang)
                    {
                        btnAddLKWLang.IsEnabled = true;
                        btnAddLKWLang.ToolTip = null;

                        btnAddLKW.IsEnabled = true;
                        btnAddLKW.ToolTip = null;

                        btnAddSprinter.IsEnabled = true;
                        btnAddSprinter.ToolTip = null;

                        btnAddPKW.IsEnabled = true;
                        btnAddPKW.ToolTip = null;
                    }
                }

                //switch(GesamtFzg - all)
                //{
                //    case int n when n < PKW:
                //        MessageBox.Show("Es können keine Lieferanten mehr eingelassen werden, da sich bereits zu viele Fahrzeuge im Werk befinden", "Kein Einlass!", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                //        noMoreDeliveries = true;

                //        btnAddLKWLang.IsEnabled = false;
                //        btnAddLKWLang.ToolTip = zuViele;

                //        btnAddLKW.IsEnabled = false;
                //        btnAddLKW.ToolTip = zuViele;

                //        btnAddSprinter.IsEnabled = false;
                //        btnAddSprinter.ToolTip = zuViele;

                //        btnAddPKW.IsEnabled = false;
                //        btnAddPKW.ToolTip = zuViele;
                //        break;
                //    case int n when n >= PKW && n < Sprinter:
                //        btnAddLKWLang.IsEnabled = false;
                //        btnAddLKWLang.ToolTip = zuViele;

                //        btnAddLKW.IsEnabled = false;
                //        btnAddLKW.ToolTip = zuViele;

                //        btnAddSprinter.IsEnabled = false;
                //        btnAddSprinter.ToolTip = zuViele;

                //        btnAddPKW.IsEnabled = true;
                //        btnAddPKW.ToolTip = null;
                //        break;
                //    case int n when n >= Sprinter && n < LKW:
                //        btnAddLKWLang.IsEnabled = false;
                //        btnAddLKWLang.ToolTip = zuViele;

                //        btnAddLKW.IsEnabled = false;
                //        btnAddLKW.ToolTip = zuViele;

                //        btnAddSprinter.IsEnabled = true;
                //        btnAddSprinter.ToolTip = null;

                //        btnAddPKW.IsEnabled = true;
                //        btnAddPKW.ToolTip = null;
                //        break;
                //    case int n when n >= LKW && n < LKWLang:
                //        btnAddLKWLang.IsEnabled = false;
                //        btnAddLKWLang.ToolTip = zuViele;

                //        btnAddLKW.IsEnabled = true;
                //        btnAddLKW.ToolTip = null;

                //        btnAddSprinter.IsEnabled = true;
                //        btnAddSprinter.ToolTip = null;

                //        btnAddPKW.IsEnabled = true;
                //        btnAddPKW.ToolTip = null;
                //        break;
                //    case int n when n >= LKWLang:
                //        btnAddLKWLang.IsEnabled = true;
                //        btnAddLKWLang.ToolTip = null;

                //        btnAddLKW.IsEnabled = true;
                //        btnAddLKW.ToolTip = null;

                //        btnAddSprinter.IsEnabled = true;
                //        btnAddSprinter.ToolTip = null;

                //        btnAddPKW.IsEnabled = true;
                //        btnAddPKW.ToolTip = null;
                //        break;
                //}
            }
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            if (noMoreDeliveries) 
                this.Close();
            else
                this.Visibility = Visibility.Visible;


            Helper.CheckWindowIsInScreenSpace(this);
        }



        private void btnFiltern_Click(object sender, RoutedEventArgs e)
        {
            //var list = SQL.ReadListStringTwoColumns($"SELECT Firma, Fahrer FROM {MainWindow.table}.lieferanten WHERE Firma LIKE '%{tbFilter.Text}%' OR Fahrer LIKE '%{tbFilter.Text}%'", "  Fahrer: ").Result;
            //list = list.OrderBy(p => p).ToList();
            //cBLieferfirma.ItemsSource = list;

            Filter();
        }

        private void tbFilter_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.Key == Key.Enter)
            {
                Filter();
            }
        }

        private void Filter()
        {
            if (_emergency)
            {
                //var list = SQL.ReadListStringMultipleColumns($"SELECT Firma, Fahrer, Kennzeichen, ID FROM {MainWindow.table}.lieferanten WHERE ((Firma = 'DB Energie' AND Fahrer LIKE '%{tbFilter.Text}%') OR (Firma = 'DB Energie' AND Kennzeichen LIKE '%{tbFilter.Text}%') OR (Firma = 'DB Energie' AND ID LIKE '%{tbFilter.Text}%')) OR" +
                //             $"((Firma = 'DB InfraGo' AND Fahrer LIKE '%{tbFilter.Text}%') OR (Firma = 'DB InfraGo' AND Kennzeichen LIKE '%{tbFilter.Text}%') OR (Firma = 'DB InfraGo' AND ID LIKE '%{tbFilter.Text}%')) OR" +
                //             $"((Firma = 'DB Notfallmanager' AND Fahrer LIKE '%{tbFilter.Text}%') OR (Firma = 'DB Notfallmanager' AND Kennzeichen LIKE '%{tbFilter.Text}%') OR (Firma = 'DB Notfallmanager' AND ID LIKE '%{tbFilter.Text}%')) OR" +
                //             $"((Firma = 'DB KT' AND Fahrer LIKE '%{tbFilter.Text}%') OR (Firma = 'DB KT' AND Kennzeichen LIKE '%{tbFilter.Text}%') OR (Firma = 'DB KT' AND ID LIKE '%{tbFilter.Text}%') OR (Firma LIKE 'DB%' AND Firma LIKE '%{tbFilter.Text}%'))", 4, "        Fahrer: ", "        Kennz.: ", "      ID: ").Result;

                ////var list = SQL.ReadListStringMultipleColumns($"SELECT Firma, Fahrer, Kennzeichen, ID FROM {MainWindow.table}.lieferanten WHERE (Firma = 'DB Energie' OR (Firma = 'DB Energie' AND Fahrer LIKE '%{tbFilter.Text}%') OR (Firma = 'DB Energie' AND Kennzeichen LIKE '%{tbFilter.Text}%') OR (Firma = 'DB Energie' AND ID LIKE '%{tbFilter.Text}%')) OR" +
                ////                             $"(Firma = 'DB InfraGo' OR (Firma = 'DB InfraGo' AND Fahrer LIKE '%{tbFilter.Text}%') OR (Firma = 'DB InfraGo' AND Kennzeichen LIKE '%{tbFilter.Text}%') OR (Firma = 'DB InfraGo' AND ID LIKE '%{tbFilter.Text}%')) OR" +
                ////                             $"(Firma = 'DB Notfallmanager' OR (Firma = 'DB Notfallmanager' AND Fahrer LIKE '%{tbFilter.Text}%') OR (Firma = 'DB Notfallmanager' AND Kennzeichen LIKE '%{tbFilter.Text}%') OR (Firma = 'DB Notfallmanager' AND ID LIKE '%{tbFilter.Text}%')) OR" +
                ////                             $"(Firma = 'DB KT' OR (Firma = 'DB KT' AND Fahrer LIKE '%{tbFilter.Text}%') OR (Firma = 'DB KT' AND Kennzeichen LIKE '%{tbFilter.Text}%') OR (Firma = 'DB KT' AND ID LIKE '%{tbFilter.Text}%'))", 4, "        Fahrer: ", "        Kennz.: ", "      ID: ").Result;

                //list = list.OrderBy(p => p).ToList();
                //cBLieferfirma.ItemsSource = list; // Gehört hier nicht eigentlich cBEntstördienste hin????
            }
            else
            {
                var list = SQL.ReadSQL($"SELECT Firma, Fahrer, Kennzeichen, ID, Handynr FROM {MainWindow.table}.lieferanten WHERE Firma NOT LIKE 'DB%' AND (Fahrer LIKE '%{tbFilter.Text}%' OR Firma LIKE '%{tbFilter.Text}%' OR Kennzeichen LIKE '%{tbFilter.Text}%' OR ID LIKE '%{tbFilter.Text}%') ORDER BY Firma ASC").Result;
                var items = from DataRow row in list.Rows
                            select new Lieferant
                            {
                                ID = row["ID"].ToString(),
                                Firma = row["Firma"].ToString(),
                                Fahrer = row["Fahrer"].ToString(),
                                Kennzeichen = row["Kennzeichen"].ToString(),
                                Telefon = row["Handynr"].ToString()
                            };

                cBLieferfirma.ItemsSource = items;
            }

            cBLieferfirma.IsDropDownOpen = true;
            cBLieferfirma.Focus();
        }

        private async void btnSignature_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(tbFahrer.Text) && !string.IsNullOrWhiteSpace(tbFirma.Text))
                {
                    if (signoPad._stPad.DeviceGetCount() > 0)
                    {
                        var sig = new Signature(Signature.DisclaimerType.Parken, tbFahrer.Text, tbFirma.Text, tbKennzeichen.Text, false, "", this);
                        if (sig.ShowDialog() == false)
                        {
                            _signature = sig.ResultByte;

                            if (_signature != null)
                            {
                                gridButtons.IsEnabled = true;

                                imgLKWLang.ToolTip = "Einfahrt Lieferant mit LKW > 7,5t";
                                imgLKW.ToolTip = "Einfahrt Lieferant mit LKW < 7,5t";
                                imgSprinter.ToolTip = "Einfahrt Lieferant mit Sprinter";
                                imgPKW.ToolTip = "Einfahrt Lieferant mit PKW";
                            }
                            else
                            {
                                MessageBox.Show("Keine Unterschrift erfasst\nOhne Unterschrift kann der Lieferant nicht eingelassen werden\n\nBitte erneut versuchen!", "Keine Unterschrift!", MessageBoxButton.OK, MessageBoxImage.Error);
                                sig.Close();
                                return;
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Kein Unterschriftenpad gefunden\nMeldung 0x03", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);

#if DEBUG
                        gridButtons.IsEnabled = true;

                        imgLKWLang.ToolTip = "Einfahrt Lieferant mit LKW > 7,5t";
                        imgLKW.ToolTip = "Einfahrt Lieferant mit LKW < 7,5t";
                        imgSprinter.ToolTip = "Einfahrt Lieferant mit Sprinter";
                        imgPKW.ToolTip = "Einfahrt Lieferant mit PKW";
#endif
                    }
                }
                else MessageBox.Show(this, "Firma und Fahrer müssen ausgefüllt werden", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            catch (Exception ex)
            {
                Log.WriteLog(ex.ToString());
                MessageBox.Show($"Es ist ein1 Fehler aufgetreten\n\nInterne Meldung: {ex.Message}");
            }

        }


        private async void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            int Kategorie = 3;
            bool trotzdemAnlegen = true;

            if (_emergency)
                Kategorie = 4;




            if (!string.IsNullOrWhiteSpace(tbFirma.Text) && !string.IsNullOrWhiteSpace(tbFahrer.Text) && !string.IsNullOrWhiteSpace(tbHandy.Text) && !string.IsNullOrWhiteSpace(tbKennzeichen.Text))
            {
                if (tbFirma.Text != "DB InfraGO" && tbFirma.Text != "DB Energie" && tbFirma.Text != "DB KT" && SQL.RowExists($"{MainWindow.table}.firmen", "Name", tbFirma.Text, true, " AND Arbeitsbeginn <= now() AND Arbeitsende >= now()").Result == true)
                {
                    if (MessageBoxResult.No == MessageBox.Show($"{tbFirma.Text} existiert schon als Firma!\nFirmen dürfen nicht als Lieferant eingetragen werden!\n\nFirma in der \"Ankuft heute\" Liste bestätigen und falls diese nicht angezeigt wird, Firma abweisen!\n\nLieferant trotzdem anlegen?", "Firma nicht als Lieferant!", MessageBoxButton.YesNo, MessageBoxImage.Error))
                    {
                        trotzdemAnlegen = false;
                    }
                }


                if (trotzdemAnlegen)
                {
                    try
                    {

                        int i = 0;
                        string fzgQuery = "";
                        string fzgTime = "";

                        switch ((sender as Button).Name.ToString().Replace("btnAdd", ""))
                        {
                            case "LKWLang":
                                i = Convert.ToInt16(SQL.ReadSingleValue($"SELECT lkwlang FROM {MainWindow.table}.fahrzeuge"));
                                fzgQuery = ($"UPDATE {MainWindow.table}.fahrzeuge SET `lkwlang`='{i + 1}'");
                                fzgTime = ($"REPLACE INTO {MainWindow.table}.fzgTime (arrivalTime, fzgType, firma, fahrer, kennzeichen, telFahrer) VALUES ('{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}', 'LKWLang', '{tbFirma.Text}', '{tbFahrer.Text}', '{tbKennzeichen.Text}', '{tbHandy.Text}')");
                                StartTimer(1, tbFirma.Text);
                                break;
                            case "LKW":
                                i = Convert.ToInt16(SQL.ReadSingleValue($"SELECT lkw FROM {MainWindow.table}.fahrzeuge"));
                                fzgQuery = ($"UPDATE {MainWindow.table}.fahrzeuge SET `lkw`='{i + 1}'");
                                fzgTime = ($"REPLACE INTO {MainWindow.table}.fzgTime (arrivalTime, fzgType, firma, fahrer, kennzeichen, telFahrer) VALUES ('{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}', 'LKW', '{tbFirma.Text}', '{tbFahrer.Text}', '{tbKennzeichen.Text}', '{tbHandy.Text}')");
                                StartTimer(2, tbFirma.Text);
                                break;
                            case "Sprinter":
                                i = Convert.ToInt16(SQL.ReadSingleValue($"SELECT sprinter FROM {MainWindow.table}.fahrzeuge"));
                                fzgQuery = ($"UPDATE {MainWindow.table}.fahrzeuge SET `sprinter`='{i + 1}'");
                                fzgTime = ($"REPLACE INTO {MainWindow.table}.fzgTime (arrivalTime, fzgType, firma, fahrer, kennzeichen, telFahrer) VALUES ('{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}', 'Sprinter', '{tbFirma.Text}', '{tbFahrer.Text}', '{tbKennzeichen.Text}', '{tbHandy.Text}')");
                                StartTimer(2, tbFirma.Text);
                                break;
                            case "PKW":
                                if (!_emergency)
                                {
                                    i = Convert.ToInt16(SQL.ReadSingleValue($"SELECT pkw FROM {MainWindow.table}.fahrzeuge"));
                                    fzgQuery = ($"UPDATE {MainWindow.table}.fahrzeuge SET `pkw`='{i + 1}'");
                                    fzgTime = ($"REPLACE INTO {MainWindow.table}.fzgTime (arrivalTime, fzgType, firma, fahrer, kennzeichen, telFahrer) VALUES ('{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}', 'PKW', '{tbFirma.Text}', '{tbFahrer.Text}', '{tbKennzeichen.Text}', '{tbHandy.Text}')");
                                    StartTimer(3, tbFirma.Text);
                                }
                                break;
                        }

                        if (!string.IsNullOrWhiteSpace(fzgQuery))
                            await SQL.WriteSQL(fzgQuery);

                        if (!string.IsNullOrWhiteSpace(fzgTime))
                            await SQL.WriteSQL(fzgTime);

                        //if (tbParkplatz.Text != "")
                        //    query = ($"INSERT INTO zutritte (Kategorie,Name,Zutritt,Pruefung_Zutritt,Pruefung_Einweisung,AnzahlPers,AnzahlFzg,Ansprechpartner,Kl_Unterweisung,Fzg_gemeldet,Kennzeichen,Bemerkung, signature_blob) VALUES ('{Kategorie}','Firma: {tbFirma.Text}, Fahrer: {tbFahrer.Text}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}','--','--','1','1','{tbHandy.Text}','1','1','{tbKennzeichen.Text}','Parkplatz: {tbParkplatz.Text}\n\nBemerkung:\n{tbBemerkung.Text}', @signature)");
                        //else
                        //query = ($"INSERT INTO {MainWindow.table}.zutritte (Kategorie,Name,Zutritt,Pruefung_Zutritt,Pruefung_Einweisung,AnzahlPers,AnzahlFzg,Ansprechpartner,Kl_Unterweisung,Fzg_gemeldet,Kennzeichen,Bemerkung, signature_blob) VALUES ('{Kategorie}','Firma: {tbFirma.Text}, Fahrer: {tbFahrer.Text}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}','--','--','1','1','{tbHandy.Text}','1','1','{tbKennzeichen.Text}','{tbBemerkung.Text}', @signature)");
                        var cmd = SQL.CreateAndReturnSQLCommand($"INSERT INTO {MainWindow.table}.zutritte (Kategorie,Name,Zutritt,Pruefung_Zutritt,Pruefung_Einweisung,AnzahlPers,AnzahlFzg,Ansprechpartner,Kl_Unterweisung,Fzg_gemeldet,Kennzeichen,Bemerkung, signature_blob) VALUES (@Kategorie,@tbFirma,@time,'--','--','1','1',@tbHandy,'1','1',@tbKennzeichen,@tbBemerkung, @signature)", new List<MySqlParameter>()
                                {
                                    new MySqlParameter("@Kategorie", Kategorie),
                                    new MySqlParameter("@tbFirma", $"Firma: {tbFirma.Text.Trim()}, Fahrer: {tbFahrer.Text}"),
                                    new MySqlParameter("@time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")),
                                    new MySqlParameter("@tbHandy", tbHandy.Text),
                                    new MySqlParameter("@tbKennzeichen", tbKennzeichen.Text),
                                    new MySqlParameter("@tbBemerkung", tbBemerkung.Text)
                                });

                        await SQL.CreateAndWriteSQLwithSignature(cmd, _signature);
                        //await SQL.WriteSQL(query, _signature);

                    }
                    catch (Exception ex)
                    {
                        Log.WriteLog(ex.ToString());
                        MessageBox.Show(this, "Fehler beim Eintragen des Lieferanten", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                    }
                }

                this.Close();
            }
            else
            {
                MessageBox.Show("Felder Firma, Fahrer, Handynummer und Kennzeichen müssen ausgefüllt sein", "Fehlende Felder", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }
        }

        private void StartTimer(int v, string text)
        {
            
        }

        private async void cBLieferfirma_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ResetInputs();
            //System.Data.DataTable result = new System.Data.DataTable();

            if ((sender as ComboBox).SelectedItem != null)
            {
                if (_emergency)
                {
                    //var list = SQL.ReadListStringMultipleColumns($"SELECT identstoerdienste, Firma, Fahrer, Kennzeichen FROM {MainWindow.table}.entstoerdienste WHERE Firma = '{cBLieferfirma.SelectedValue.ToString()}'", 4, "      Firma: ", "      Fahrer: ", "        Kennz.: ").Result;
                    //list = list.OrderBy(p => p).ToList();

                    var list = await SQL.ReadSQL($"SELECT identstoerdienste, Firma, Fahrer, Kennzeichen, Handynr FROM {MainWindow.table}.entstoerdienste WHERE Firma = '{cBLieferfirma.SelectedValue.ToString().Trim()}'");
                                        var items = from DataRow row in list.Rows
                                                    select new Lieferant
                                                    {
                                                        ID = row["identstoerdienste"].ToString(),
                                                        Firma = row["Firma"].ToString(),
                                                        Fahrer = row["Fahrer"].ToString(),
                                                        Kennzeichen = row["Kennzeichen"].ToString(),
                                                        Telefon = row["Handynr"].ToString()
                                                    };

                    cBEntstoerdienste.ItemsSource = items;

                    tbFirma.Text = (sender as ComboBox).SelectedItem.ToString();
                }
                else
                {
                    //string id = (sender as ComboBox).SelectedItem.ToString().Split(new string[] { "     ID: " }, StringSplitOptions.None)[1].Trim(' ');
                    ////string fahrer = (sender as ComboBox).SelectedItem.ToString().Split(new string[] { "     Fahrer: " }, StringSplitOptions.None)[1].Split(new string[] { "     Kennz.: " }, StringSplitOptions.None)[0].TrimEnd(' ');

                    ////if (fahrer != "")
                    ////    result = await SQL.ReadSQL($"SELECT * FROM {MainWindow.table}.lieferanten WHERE Firma = '{firma}' AND Fahrer = '{fahrer}' LIMIT 1");
                    ////else
                    ////    result = await SQL.ReadSQL($"SELECT * FROM {MainWindow.table}.lieferanten WHERE Firma = '{firma}' LIMIT 1");

                    //result = await SQL.ReadSQL($"SELECT * FROM {MainWindow.table}.lieferanten WHERE ID = '{id}' LIMIT 1");

                    var result = cBLieferfirma.SelectedItem as Lieferant;

                    tbFirma.Text = result.Firma != null ? result.Firma : "";
                    tbFahrer.Text = result.Fahrer != null ? result.Fahrer : "";
                    tbHandy.Text = result.Telefon != null ? result.Telefon : "";
                    tbKennzeichen.Text = result.Kennzeichen != null ? result.Kennzeichen : "";

                    CheckParkplatz();
                }
            }
        }

        private async void cBEntstoerdienste_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if ((sender as ComboBox).SelectedItem != null)
            {
                string id = (sender as ComboBox).SelectedItem.ToString().Split(' ')[0].Trim(' ');

                var result = await SQL.ReadSQL($"SELECT * FROM {MainWindow.table}.entstoerdienste WHERE identstoerdienste = '{id}'");

                tbFirma.Text = result.Rows[0].ItemArray[1] != null ? result.Rows[0].ItemArray[1].ToString() : "";
                tbFahrer.Text = result.Rows[0].ItemArray[2] != null ? result.Rows[0].ItemArray[2].ToString() : "";
                tbHandy.Text = result.Rows[0].ItemArray[3] != null ? result.Rows[0].ItemArray[3].ToString() : "";
                tbKennzeichen.Text = result.Rows[0].ItemArray[4] != null ? result.Rows[0].ItemArray[4].ToString() : "";

                CheckParkplatz();
            }
        }

        private void CheckParkplatz()
        {
            List<string> similarities = new List<string>();

            foreach (var s in EmergencyParkList)
            {
                var ratio = Fuzz.Ratio(tbFirma.Text.ToLower(), s.Key.ToLower());
                if (ratio > 80)
                {
                    //Debug.WriteLine(ratio);
                    ShowParkplatz(s.Key, s.Value);
                    break;
                }
                else popupParkplatz.IsOpen = false;
            }
        }

        private void ShowParkplatz(string s, int parkplatz)
        {
            string isEnergie = "";
            if (parkplatz == 7) isEnergie = " oder 34";

            string _parkplatz = parkplatz.ToString().PadLeft(2,'0');
            tbParkplatzHinweis.Text = $"{s} nur den Parkplatz Nr. {_parkplatz}{isEnergie} vergeben";
            
            imgParkplatz.Source = new BitmapImage(new Uri(@"pack://application:,,,/"
                                                        + System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
                                                        + ";component/"
                                                        + $"Assets/Parkplatz/{_parkplatz}.png", UriKind.Absolute));
            
            if (parkplatz == 7)
            {
                popupParkplatz.Height = 650;
                imgEnergie.Visibility = Visibility.Visible;
            }
            else
            {
                popupParkplatz.Height = 350;
                imgEnergie.Visibility = Visibility.Collapsed;
            }

            popupParkplatz.IsOpen = true;
        }

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

        ToolTip tt = new ToolTip();
        private void tbFirma_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (!_emergency)
            {
                var box = (sender as TextBox);

                var input = box.Text;
                if (input.ToLower().Contains("db") ||
                    input.ToLower().StartsWith("service") ||
                    Regex.IsMatch(input, @"^[\W_]"))
                {
                    tt.Placement = System.Windows.Controls.Primitives.PlacementMode.RelativePoint;
                    tt.PlacementTarget = box;
                    tt.VerticalOffset = box.ActualHeight;
                    tt.HorizontalOffset = 0;
                    tt.Width = box.ActualWidth;
                    tt.Background = new SolidColorBrush(Colors.Red);
                    tt.Content = new Grid();
                    (tt.Content as Grid).Background = new SolidColorBrush(Colors.Red);
                    (tt.Content as Grid).Children.Add(new TextBlock() { Text = "DB Firmen dürfen nicht als Lieferant angelegt werden!!" });

                    tt.IsOpen = true;
                    box.ToolTip = tt;
                }
                else
                {
                    tt.IsOpen = false;
                    box.ToolTip = null;
                }


            }

            CheckParkplatz();
        }

        private void ResetInputs()
        {
            tbFahrer.Text = "";
            tbHandy.Text = "";
            tbKennzeichen.Text = "";
            tbBemerkung.Text = "";
        }


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


    public class Lieferant
    {
        public string ID { get; set; }
        public string Firma { get; set; }
        public string Fahrer { get; set; }
        public string Kennzeichen { get; set; }
        public string Telefon { get; set; }

        public override string ToString()
        {
            return $"{ID}\t\t{Firma}\t\t{Fahrer}\t\t{Kennzeichen}";
        }
    }
}
