using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
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 Arrivals.xaml
    /// </summary>
    public partial class Arrivals : Window
    {
        List<string> NamesList = new List<string>();
        int firmenCount = 0;
        int besucherCount = 0;
        bool arrivalClicked = false;
        bool kl_EinweisungClicked = false;
        string query = "";
        byte[] _signature = null;
        Window mainWindow = null;

        int fzgCount = 0;

        public Arrivals(Window main, string Parameter = "")
        {
            InitializeComponent();
            arrivalClicked = false;

            mainWindow = main;

            var list = SQL.ReadListString("Select Name FROM zkup.firmen").Result;
            list = list.OrderBy(p => p).ToList();
 
            NamesList.Add("Firmen:");
            NamesList.Add("------------");
            NamesList.AddRange(list);
            NamesList.Add("");
            NamesList.Add("============");
            NamesList.Add("");

            firmenCount = NamesList.Count;


            list = SQL.ReadListString("Select Name FROM zkup.besucher").Result;
            list.OrderBy(p => p).ToList();

            NamesList.Add("Besucher:");
            NamesList.Add("------------");
            NamesList.AddRange(list);

            besucherCount = NamesList.Count - firmenCount;


            cbName.ItemsSource = NamesList;


            if (Parameter != "")
            {
                cbName.SelectionChanged += CbName_SelectionChanged;
                cbName.SelectedItem = Parameter;
                tbAnzahlPersonen.Focus();

                tbVerantwortlPerson.Text = SQL.ReadSingleValue($"SELECT Verantwortlicher_MA_Firma FROM zkup.firmen WHERE `Name` = '{Parameter}' LIMIT 1");
                tbNrVerantwortlPerson.Text = SQL.ReadSingleValue($"SELECT Tel_Nr_Verantwortlicher_Firma FROM zkup.firmen WHERE `Name` = '{Parameter}' LIMIT 1");
            }
            else
            {
                cbName.SelectionChanged += CbName_SelectionChanged;
                cbName.IsDropDownOpen = true;
            }

            if(signoPad._stPad.DeviceGetCount() <= 0)
            {
                btnSignature.IsEnabled = false;
                btnCheck.IsEnabled = true;

                btnSignature.ToolTip = "Kein Unterschriftenpad gefunden";
            }
        }




        private async void BtnCheck_Click(object sender, RoutedEventArgs e)
        {
            var zutritt = "";
            
            var einweis = "";
            var kl_einweis = "";
            string kat = "1";
            string asp = "";
            string anzFzg = "";
            int klUnterweis = 0;
            int anzFzgGemeldet = 0;

            DataTable table = new DataTable();

            if (cbName.SelectedIndex < firmenCount)
            {
                table = await SQL.ReadSQL("Select * FROM zkup.firmen");
                kat = "1";
            }
            else
            {
                table = await SQL.ReadSQL("Select * FROM zkup.besucher");
                kat = "2";
            }

            foreach(DataRow row in table.Rows)
            {
                if(row.ItemArray[1].ToString() == cbName.SelectedValue.ToString())
                {
                    DateTime beginnDT;
                    DateTime endeDT;
                    DateTime einweisDT;
                    DateTime kl_einweisDT;


                    if (kat == "1")
                    {
                        if (string.IsNullOrWhiteSpace(tbAnzahlFzg.Text))
                        {
                            MessageBox.Show(this, "Anzahl Fahrzeuge eingeben", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                            return;
                        }

                        if (string.IsNullOrWhiteSpace(tbAnzahlPersonen.Text))
                        {
                            MessageBox.Show(this, "Anzahl Personen eingeben", "Achtung!", MessageBoxButton.OK, MessageBoxImage.Warning);
                            return;
                        }


                        if (DateTime.TryParse(row.ItemArray[7].ToString(), out beginnDT)
                            && DateTime.TryParse(row.ItemArray[8].ToString(), out endeDT))
                        {
                            if (DateTime.Now.Date >= beginnDT.Date && DateTime.Now.Date <= endeDT.Date)
                                zutritt = "OK";
                            else zutritt = "Prüfen!";
                        }
                        else
                        {
                            zutritt = $"Fehler! Bitte bei {row.ItemArray[10]} nachfragen";
                            einweis = $"Fehler! Bitte bei {row.ItemArray[10]} nachfragen";
                        }

                        if (Convert.ToInt16(tbAnzahlFzg.Text) <= Convert.ToInt16(row.ItemArray[5]))
                        {
                            anzFzg = "OK";
                        }
                        else
                        {
                            anzFzg = $"Nur {row.ItemArray[5].ToString()} Fahrzeug(e) angemeldet";
                        }

                        anzFzgGemeldet = row.ItemArray[5] != null ? Convert.ToInt16(row.ItemArray[5]) : 0;


                        if (DateTime.TryParse(row.ItemArray[9].ToString(), out einweisDT))
                        {
                            if(row.ItemArray[9].ToString() == "01.01.1903 00:00:00")
                            {
                                einweis = "Nur in Begleitung";
                            }
                            else if (DateTime.Now.Date <= einweisDT)
                                einweis = "OK";
                            else einweis = "Prüfen!";
                        }
                        else
                        {
                            zutritt = $"Fehler! Bitte bei {row.ItemArray[10]} nachfragen";
                            einweis = $"Fehler! Bitte bei {row.ItemArray[10]} nachfragen";
                        }

                        if(DateTime.TryParse(row.ItemArray[12].ToString(), out kl_einweisDT))
                        {
                            if (DateTime.Now.Date <= einweisDT)
                            {
                                kl_einweis = "OK";
                                klUnterweis = 1;
                            }
                            else
                            {
                                kl_einweis = "Kleine Unterweisung durchführen!";
                                klUnterweis = 0;
                            }
                        }
                        else
                        {
                            kl_einweis = "Bitte kleine Unterweisung durchführen!";
                            klUnterweis = 0;
                        }

                        asp = tbVerantwortlPerson.Text + " / " + tbNrVerantwortlPerson.Text; //row.ItemArray[10].ToString();
                    }

                    if (kat == "2")
                    {
                        if (DateTime.TryParse(row.ItemArray[5].ToString(), out beginnDT))
                        {
                            if (DateTime.Now.Date == beginnDT)
                                zutritt = "OK";
                            else zutritt = "Prüfen!";
                        }
                        else
                        {
                            zutritt = $"Fehler! Bitte bei {row.ItemArray[7]} nachfragen";
                            einweis = $"Fehler! Bitte bei {row.ItemArray[7]} nachfragen";
                        }

                        //if (DateTime.TryParse(row.ItemArray[6].ToString(), out einweisDT))
                        //{
                        //    if (DateTime.Now.Date <= einweisDT)
                        //        einweis = "OK";
                        //    else einweis = "Prüfen!";
                        //}
                        //else
                        //{
                        //    zutritt = $"Fehler! Bitte bei {row.ItemArray[7]} nachfragen";
                        //    einweis = $"Fehler! Bitte bei {row.ItemArray[7]} nachfragen";
                        //}
                        einweis = "--";
                        anzFzg = "--";

                        if (DateTime.TryParse(row.ItemArray[9].ToString(), out kl_einweisDT))
                        {
                            if (DateTime.Now.Date <= kl_einweisDT)
                            {
                                kl_einweis = "OK";
                                klUnterweis = 1;
                            }
                            else
                            {
                                kl_einweis = "Kleine Unterweisung durchführen!";
                                klUnterweis = 0;
                            }
                        }
                        else
                        {
                            kl_einweis = "Kleine Unterweisung durchführen!";
                            klUnterweis = 0;
                        }

                        asp = row.ItemArray[7].ToString();
                    }
                }
            }

            lblAnmeldung.Content = zutritt;
            if (zutritt == "OK") lblAnmeldung.Background = new SolidColorBrush(Colors.LightGreen);
            else if (zutritt == "Prüfen!") lblAnmeldung.Background = new SolidColorBrush(Colors.LightYellow);
            else lblAnmeldung.Background = new SolidColorBrush(Colors.LightSalmon);

            lblFahrzeuge.Content = anzFzg;
            if (anzFzg == "OK") lblFahrzeuge.Background = new SolidColorBrush(Colors.LightGreen);
            else if (anzFzg.StartsWith("Nur")) lblFahrzeuge.Background = new SolidColorBrush(Colors.LightYellow);
            else if (anzFzg == "--") lblFahrzeuge.Background = new SolidColorBrush(Colors.LightGray);
            else lblFahrzeuge.Background = new SolidColorBrush(Colors.LightSalmon);


            lblEinweisung.Content = einweis;
            if (einweis == "OK") lblEinweisung.Background = new SolidColorBrush(Colors.LightGreen);
            else if (einweis == "Prüfen!") lblEinweisung.Background = new SolidColorBrush(Colors.LightYellow);
            else if (einweis == "--") lblEinweisung.Background = new SolidColorBrush(Colors.LightGray);
            else lblEinweisung.Background = new SolidColorBrush(Colors.LightSalmon);

            lblKleineUnterweisung.Content = kl_einweis;
            if (kl_einweis == "OK") lblKleineUnterweisung.Background = new SolidColorBrush(Colors.LightGreen);
            else if (kl_einweis == "Kleine Unterweisung durchführen!")
            {
                lblKleineUnterweisung.Background = new SolidColorBrush(Colors.LightYellow);
                lblKleineUnterweisung.Content = "↓ " + kl_einweis + " ↓";
            }
            else lblKleineUnterweisung.Background = new SolidColorBrush(Colors.LightSalmon);


            var AnzPers = "0";
            var AnzFzg = "0";

            if (tbAnzahlFzg.Text != "")
                AnzFzg = tbAnzahlFzg.Text;

            if (tbAnzahlPersonen.Text != "")
                AnzPers = tbAnzahlPersonen.Text;

            if (einweis == "") einweis = "Fehlerhaft";
            if (zutritt == "") zutritt = "Fehlerhaft";

            arrivalClicked = true;

            var kennzeichenTextboxes = spKennzeichen.Children.OfType<TextBox>().ToList();
            string kennzeichen = "";

            for (var i = 0; i < fzgCount; i++)
            {
                if (kennzeichenTextboxes.Count >= i)
                    if (kennzeichen == "")
                        kennzeichen = $"{((kennzeichenTextboxes[i]) as TextBox).Text}";
                    else
                    {
                        if (!string.IsNullOrWhiteSpace(((kennzeichenTextboxes[i]) as TextBox).Text))
                            kennzeichen = $"{kennzeichen} / {((kennzeichenTextboxes[i]) as TextBox).Text}";
                    }
            }

            query = $"INSERT INTO zutritte (Kategorie,Name,Zutritt,Pruefung_Zutritt,Pruefung_Einweisung,AnzahlPers,AnzahlFzg,Ansprechpartner,Kl_Unterweisung,Fzg_gemeldet,Kennzeichen,Bemerkung,signature_blob) VALUES ('{kat}','{cbName.SelectedValue.ToString().Replace(",",";")}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}','{zutritt}','{einweis}','{AnzPers.Replace(",",";")}','{AnzFzg.Replace(",", ";")}','{asp.Replace(",", ";")}','{klUnterweis}','{anzFzgGemeldet}','{kennzeichen}','{tbBemerkung.Text}',@signature)";

            btnSignature.IsEnabled = true;

            if (klUnterweis == 0) btnKlEinweisung_durchgeführt.IsEnabled = true;
            else if (klUnterweis == 1)
            {
                btnKlEinweisung_durchgeführt.ToolTip = "Kleine Unterweisung wurde bereits durchgeführt\nBestätigung nicht nötig";
                btnSignature.ToolTip = "Kleine Unterweisung wurde bereits durchgeführt\nUnterschrift nicht nötig";
                btnSignature.Content = "Unterschrift bereits vorhanden";
            }

            if (arrivalClicked) btnClose.IsEnabled = true;
        }


        protected override void OnClosing(CancelEventArgs e)
        {
            try
            {
                if (arrivalClicked)
                {
                    e.Cancel = true;
                    MessageBox.Show(this, "Ankunft wurde geklickt\n\nBitte Fenster über \"Schließen\"-Button schließen", "Fehler", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                signoPad.CloseConnection();
                mainWindow.Focus();
            }
            catch (Exception ex)
            {
                Log.WriteLog(ex.ToString());
                
                MessageBox.Show("Fehler: " + ex.Message);
            }
        }



        private async void Close_Click(object sender, RoutedEventArgs e)
        {
            if (arrivalClicked)
            {
                await SQL.WriteSQL(query, _signature);

                arrivalClicked = false;
                
                this.Close();
            }

            signoPad.CloseConnection();
        }

        private async void CbName_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (cbName.SelectedValue != null)
            {
                if(cbName.SelectedItem.ToString() == "------------" || cbName.SelectedItem.ToString() == "============" || cbName.SelectedItem.ToString() == "Besucher:" || cbName.SelectedItem.ToString() == "Firmen:" || (cbName.SelectedItem.ToString() == "" && cbName.SelectedIndex != -1))
                {
                    cbName.SelectedIndex = -1;
                    MessageBox.Show(this, "Dieses Feld kann nicht gewählt werden", "Fehler!", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                string a_Fzg = await SQL.ReadSingleValueAsync($"SELECT Anzahl_Fzg FROM zkup.firmen WHERE `Name`='{cbName.SelectedValue.ToString()}' AND `Arbeitsbeginn` <= current_date() AND `Arbeitsende` >= current_date()");
                lblAngemeldeteFzg.Text = !string.IsNullOrWhiteSpace(a_Fzg) ? a_Fzg + " Fzg. angemeldet" : "keine Fzg. angemeldet";

                spKennzeichen.Children.Clear();
                
                if (!string.IsNullOrWhiteSpace(a_Fzg))
                {
                    fzgCount = Convert.ToInt16(a_Fzg);

                    for (var i = 0; i < fzgCount; ++i)
                    {
                        spKennzeichen.Children.Add(new TextBox()
                        {
                            Name = $"tbKennzeichen{i + 1}",
                            Height = 23,
                            Margin = new Thickness(0, 2, 0, 0),
                            TextWrapping = TextWrapping.Wrap,
                            VerticalAlignment = VerticalAlignment.Top,
                            TextAlignment = TextAlignment.Center,
                            Padding = new Thickness(0, 2, 0, 0),
                            TabIndex = 3 + i
                        });

                        spKennzeichen.Children.Add(new TextBlock()
                        {
                            Margin = new Thickness(0, -21, 0, 0),
                            Width = 100,
                            TextWrapping = TextWrapping.Wrap,
                            Text = $"{i+1}. Kennzeichen",
                            VerticalAlignment = VerticalAlignment.Top,
                            HorizontalAlignment = HorizontalAlignment.Left,
                            Foreground = new SolidColorBrush(Colors.Gray),
                            Padding = new Thickness(5, 0, 0, 0)
                        });

                        this.Height = this.Height + 11;
                    }
                }

                btnCheck.IsEnabled = true;
                btnKarte.IsEnabled = true;
            }            
        }

        private async void btnSignature_Click(object sender, RoutedEventArgs e)
        {
            string kat = "1";
            string firmaBesucher = "";
            string name = "";

            var kennzeichenTextboxes = spKennzeichen.Children.OfType<TextBox>().ToList();
            string kennzeichen = "";

            for(var i = 0; i < fzgCount; i++)
            {
                if (kennzeichenTextboxes.Count >= i)
                    if (kennzeichen == "")
                        kennzeichen = $"{((kennzeichenTextboxes[i]) as TextBox).Text}";
                    else
                        kennzeichen = $"{kennzeichen} / {((kennzeichenTextboxes[i]) as TextBox).Text}";
            }

            if (cbName.SelectedIndex < firmenCount)
            {
                firmaBesucher = cbName.SelectedValue.ToString();
                name = await SQL.ReadSingleValueAsync($"SELECT Verantwortlicher_MA_Firma FROM zkup.firmen WHERE Name = '{cbName.SelectedValue.ToString()}'");
            }
            else
            {
                firmaBesucher = cbName.SelectedValue.ToString();
                name = await SQL.ReadSingleValueAsync($"SELECT Ansprechpartner_Intern FROM zkup.besucher WHERE Name = '{cbName.SelectedValue.ToString()}'");
            }

            if (signoPad._stPad.DeviceGetCount() > 0)
            {
                var sig = new Signature(name, cbName.SelectedValue.ToString(), kennzeichen);
                if (sig.ShowDialog() == false)
                {
                    _signature = sig.ResultByte;

                    btnCheck.IsEnabled = true;
                }
            }
            else
                MessageBox.Show("Kein Unterschriftenpad gefunden\nMeldung 0x01", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
        }

        private async void btnKlEinweisung_durchgeführt_Click(object sender, RoutedEventArgs e)
        {
            if (signoPad._stPad.DeviceGetCount() <= 0)
            {
                btnSignature.IsEnabled = false;
                btnSignature.ToolTip = "Kein Unterschriftenpad gefunden";
            }
            else { btnSignature.IsEnabled = true; btnSignature.Content = "Unterschrift einholen!"; }

            if (cbName.SelectedIndex < firmenCount)            
                await SQL.WriteSQL($"UPDATE zkup.firmen SET Kleine_Unterweisung_bis = '{(DateTime.Now.Date.AddYears(1)).ToString("yyyy-MM-dd")}' WHERE Name = '{cbName.SelectedValue.ToString()}'");            
            else
                await SQL.WriteSQL($"UPDATE zkup.besucher SET Kleine_Unterweisung_bis = '{(DateTime.Now.Date.AddYears(1)).ToString("yyyy-MM-dd")}' WHERE Name = '{cbName.SelectedValue.ToString()}'");

            var s = query.Split(',');
            s[20] = "1";
            query = string.Join(",", s);

            btnKlEinweisung_durchgeführt.Background = new SolidColorBrush(Colors.GreenYellow);
        }

        private void btnKarte_Click(object sender, RoutedEventArgs e)
        {
            AddCardUser aI = new AddCardUser(cbName.SelectedItem.ToString());
            aI.Owner = this;
            aI.ShowDialog();
        }

        private void Window_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            this.Opacity = 1;
        }

        private void Window_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            this.Opacity = 0.5;
        }

        private void CloseWithX_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Window_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            this.DragMove();
        }
    }
}
