using MahApps.Metro.Controls;
using System;
using System.Collections.Generic;
using System.IO;
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 AddCardUser.xaml
    /// </summary>
    public partial class AddCardUser : MetroWindow
    {
        string _user = "";
        //string _ansprechpartnerFirma = "";
        bool _isBesucher = false;
        List<string> comboList = new List<string>() { "Grün", "Rot", "Gerätewagen" };
        List<string> comboListNurRot = new List<string>() { "Rot" };

        List<string> mitarbeiterList = new List<string>();
        List<string> telList = new List<string>();

        byte[] _signature = null;
        string _ap = "";
        bool _needTel = true;

        public AddCardUser(string user = "", bool isBesucher = false, string count = "", string ap = "", bool needTel = true, bool hasEinweisung = false, string firma = "", string telnr = "", string idFirma = "")
        {
            _user = user;
            _ap = ap;
            _needTel = needTel;
            _isBesucher = isBesucher;

            InitializeComponent();

            Helper.InitSerial();
            Helper.DataReceived += Helper_DataReceived;

            this.Title = "Karten ausgeben  -  " + count;

            lblFirma.Text = isBesucher ? "Firma" : "Firma*";
            lblTelnr.Text = needTel ? "Telefonnummer*" : "Telefonnummer";

            cbColor.ItemsSource = isBesucher ? comboListNurRot : comboList;
            cbColor.ItemsSource = hasEinweisung ? comboList : comboListNurRot;
            //cbColor.ItemsSource = comboListNurRot;

            if (!isBesucher)
            {
                tbFirma.Text = firma;
                mitarbeiterList = SQL.ReadSingleValue($"SELECT Personen FROM {MainWindow.table}.firmenPeople WHERE idFirmen = '{idFirma}'").Split(';').ToList();
                telList = SQL.ReadSingleValue($"SELECT TelNr FROM {MainWindow.table}.firmenPeople WHERE idFirmen = '{idFirma}'").Split(';').ToList();
                if (!mitarbeiterList.Contains(user)) mitarbeiterList.Add(user);
                if (!telList.Contains(telnr)) telList.Add(telnr);

                tbUser.ItemsSource = mitarbeiterList;
                tbTelnr.ItemsSource = telList;

                if (!string.IsNullOrWhiteSpace(count))
                {
                    var selection = Convert.ToInt16(count.Split('/')[0]) - 2;
                    tbUser.SelectedIndex = selection;
                    tbTelnr.SelectedIndex = selection;
                }
            }

            if (!user.Contains("["))
            {
                if(tbUser.SelectedIndex == -1) tbUser.Text = user;
                try
                {
                    if (user != "")
                        tbTelnr.Text = telnr;
                        //tbTelnr.Text = SQL.ReadSingleValue($"SELECT Tel_Nr_Verantwortlicher_Firma FROM {MainWindow.table}.firmen WHERE Name='{user}'");
                }
                catch (Exception)
                {
                }
            }
            else
            {
                tbUser.Text = user.Split(',')[1].TrimEnd(']').Trim();
                tbTelnr.Text = SQL.ReadSingleValue($"SELECT TelNr FROM {MainWindow.table}.family WHERE Name='{tbUser.Text}'");
                cbColor.SelectedIndex = 0;
                tbNummer.Focus();
            }
        }

        private void Helper_DataReceived(object sender, string e)
        {
            var text = "";
            Dispatcher.Invoke(() => text = tbNummer.Text = e.Split('=')[0]);

            if (!string.IsNullOrWhiteSpace(text))
            {
               var farbe = SQL.ReadSingleValue($"SELECT Farbe FROM {MainWindow.table}.kartennummern WHERE Kartennummer='{text}'");

                Dispatcher.Invoke(() =>
                {
                    switch (farbe)
                    {
                        case "1":
                            cbColor.SelectedValue = "Rot";
                            break;
                        case "2":
                            cbColor.SelectedValue = "Grün";
                            break;
                    }
                });
            }
        }

        private async void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(tbNummer.Text))
                MessageBox.Show(this, "Kartennummer angeben!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            else if (cbColor.SelectedIndex == -1)
                MessageBox.Show(this, "Kartenfarbe auswählen!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            else if (string.IsNullOrWhiteSpace(tbUser.Text))
                MessageBox.Show(this, "Person angeben!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            else if (!_isBesucher && string.IsNullOrWhiteSpace(tbFirma.Text))
                MessageBox.Show(this, "Firma angeben!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            else if (_needTel && string.IsNullOrWhiteSpace(tbTelnr.Text))
                MessageBox.Show(this, "Telefonnummer angeben!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            else
            {
                try
                {
                    var sig = new Signature(Signature.DisclaimerType.Rot, tbUser.Text, tbTelnr.Text);

                    if (sig.ShowDialog() == false)
                    {
                        _signature = sig.ResultByte;

                        if (_signature != null)
                        {
                            await SQL.WriteSQL($"REPLACE INTO karten (kartennr,farbe,benutzer,telnr,AusgegebenDurch,AusgegebenTimestamp,Ansprechpartner,Signature) VALUES ('{tbNummer.Text}','{cbColor.SelectedValue.ToString()}','{tbUser.Text}','{tbTelnr.Text}','{Environment.UserName}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}','{_ap}',@signature)", _signature);

                            MessageBox.Show(this, "Karte erfolgreich verknüpft", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information);

                            ResetValues();
                            this.Close();
                        }
                        else MessageBox.Show("Unterschrift nicht gefunden\nVorgang bitte wiederholen");
                    }

                }
                catch (MySql.Data.MySqlClient.MySqlException ex)
                {
                    if (MessageBox.Show(this, "Beim verknüpfen der Karte ist ein Fehler aufgetreten\n\nMöchten Sie die interne Fehlermeldung anzeigen?", "Fehler", MessageBoxButton.YesNo, MessageBoxImage.Error, MessageBoxResult.No) == MessageBoxResult.Yes)
                        MessageBox.Show(this, $"Fehlermeldung:\n\n{ex.Message}", "Fehlermeldung", MessageBoxButton.OK, MessageBoxImage.Information);
                }
            }
        }

        private void ResetValues()
        {
            
            tbNummer.Text = "";
            tbTelnr.Text = "";
            
        }


        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Helper.CheckWindowIsInScreenSpace(this);
        }

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

    }
}
