using MahApps.Metro.Controls;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.RightsManagement;
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 AddVisitorsList.xaml
    /// </summary>
    public partial class AddVisitorsList : MetroWindow
    {
        public int GroupID { get; private set; }
        int width = 0;
        bool _isEdit = false;
        int _idBesucher = 0;

        public AddVisitorsList(int VisitorCount, bool isEdit = false, int idBesucher = 0)
        {
            InitializeComponent();

            BuildWindow(VisitorCount);

            if (isEdit)
            {
                _isEdit = isEdit;
                _idBesucher = idBesucher;
                btnAdd.Visibility = Visibility.Visible;

                var list = SQL.ReadSingleValue($"SELECT besucherList FROM {MainWindow.table}.besucherGroups WHERE idbesucher = '{idBesucher}'").Split(';');

                if (list.Length > 0)
                {
                    var boxes = Helper.FindVisualChildren<TextBox>(spGroup).ToList();

                    for (var i = 0; i < Helper.FindVisualChildren<TextBox>(spGroup).Count(); i++)
                    {
                        if (list.Length > i && !string.IsNullOrWhiteSpace(list[i]))
                            boxes[i].Text = list[i];
                    }
                }
            }
        }

        private void BuildWindow(int besucherAnzahl)
        {
            int maxProSpalte = 10;    // Maximale Anzahl an Textfeldern pro Spalte

            // PanelsContainer soll die WrapPanels halten
            spGroup.Children.Clear();  // Vorherige Panels entfernen (falls schon welche existieren)

            // Erstelle die WrapPanels und füge sie dem StackPanel hinzu
            int columnCount = (int)Math.Ceiling((double)besucherAnzahl / maxProSpalte);

            for (int i = 0; i < columnCount; i++)
            {
                WrapPanel wrapPanel = new WrapPanel
                {
                    Orientation = Orientation.Vertical,  // Jedes WrapPanel wird vertikal sein
                    Margin = new Thickness(10),
                    Width = 300
                };

                // Für jedes WrapPanel Textfelder hinzufügen
                for (int j = 0; j < maxProSpalte && (i * maxProSpalte + j) < besucherAnzahl; j++)
                {
                    var sp = new StackPanel();
                    var lbl = new TextBlock() { Text = $"Begleitperson Nr. {i * maxProSpalte + j + 1}:", Margin = new Thickness(5), Height = 20 };
                    lbl.SetResourceReference(Control.ForegroundProperty, SystemColors.ControlTextBrushKey);
                    sp.Children.Add(lbl);
                    var tb = new TextBox() { Margin = new Thickness(10, 0, 10, 0), Height = 30, Width = 280, ToolTip = "Um eine Person zu entfernen, Feld leer lassen" };
                    ToolTipService.SetInitialShowDelay(tb, 200);
                    MahApps.Metro.Controls.TextBoxHelper.SetWatermark(tb, "Vorname Nachname");
                    sp.Children.Add(tb);


                    wrapPanel.Children.Add(sp);
                }

                // Das WrapPanel zum StackPanel hinzufügen
                spGroup.Children.Add(wrapPanel);
            }

            width = (columnCount * 320) + 10;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.Height = spGroup.DesiredSize.Height + 40;
            this.Width = width;

            Helper.CheckWindowIsInScreenSpace(this);
        }

        private async void btnSend_Click(object sender, RoutedEventArgs e)
        {
            var legit = await SendIt();
            if(legit) this.Close();
        }

        private async Task<bool> SendIt()
        {
            var visitors = "";

            foreach (var t in this.FindChildren<TextBox>())
            {
                if (!string.IsNullOrWhiteSpace(t.Text))
                {
                    if (t.Text.ToList<char>().Distinct().Count() < 4)
                    {
                        MessageBox.Show("Personen müssen qualifiziert angegeben werden!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                        return false;
                    }
                    else
                        visitors += t.Text + ";";

                    //MessageBox.Show("Alle Besucher müssen eingetragen werden!", "Unzureichende Eingabe", MessageBoxButton.OK, MessageBoxImage.Error);
                    //return;
                }
            }

            try
            {
                var count = visitors.Split(';').Count() - 1;

                if (count > 0)
                {
                    if (_isEdit)
                    {
                        if (Helper.FindVisualChildren<TextBox>(spGroup).Count() > count)
                            if (MessageBoxResult.OK == MessageBox.Show("Es müssen alle Besucher namentlich angegeben werden\n\nEs wird nur die Anzahl der ausgefüllten Felder als 'Anzahl Begleitpersonen' hinterlegt", "Unzureichende Angaben", MessageBoxButton.OKCancel, MessageBoxImage.Warning))
                            {
                                if (SQL.RowExists(MainWindow.table.ToString() + ".besucherGroups", "idbesucher", _idBesucher.ToString()).Result)
                                {
                                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.besucherGroups SET besucherList = '{visitors}' WHERE idbesucher = '{_idBesucher}'");
                                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.besucherGroups SET besucherList = @visitors WHERE idbesucher = @idbesucher", new List<MySqlParameter>()
                                    {
                                        new MySqlParameter("@visitors", visitors),
                                        new MySqlParameter("@idbesucher", _idBesucher)
                                    });

                                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.besucher SET Anzahl_Begleitpersonen = '{count}' WHERE idbesucher = '{_idBesucher}'");
                                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.besucher SET Anzahl_Begleitpersonen = @count WHERE idbesucher = @idbesucher", new List<MySqlParameter>()
                                    {
                                        new MySqlParameter("@count", count),
                                        new MySqlParameter("@idbesucher", _idBesucher)
                                    });
                                }
                                else
                                {
                                    //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.besucherGroups (besucherList, idbesucher) VALUES ('{visitors}','{_idBesucher}')");
                                    GroupID = await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.besucherGroups (besucherList, idbesucher) VALUES (@visitors,@idbesucher)", new List<MySqlParameter>()
                                    {
                                        new MySqlParameter("@visitors", visitors),
                                        new MySqlParameter("@idbesucher", _idBesucher)
                                    });

                                    //await SQL.WriteSQL($"UPDATE {MainWindow.table}.besucher SET Anzahl_Begleitpersonen = '{count}' WHERE idbesucher = '{_idBesucher}'");
                                    await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.besucher SET Anzahl_Begleitpersonen = @count WHERE idbesucher = @idbesucher", new List<MySqlParameter>()
                                    {
                                        new MySqlParameter("@count", count),
                                        new MySqlParameter("@idbesucher", _idBesucher)
                                    });
                                }
                            }
                            else return false;
                        else
                        {
                            if (SQL.RowExists(MainWindow.table.ToString() + ".besucherGroups", "idbesucher", _idBesucher.ToString()).Result)
                            {
                                //await SQL.WriteSQL($"UPDATE {MainWindow.table}.besucherGroups SET besucherList = '{visitors}' WHERE idbesucher = '{_idBesucher}'");
                                await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.besucherGroups SET besucherList = @visitors WHERE idbesucher = @idbesucher", new List<MySqlParameter>()
                                {
                                        new MySqlParameter("@visitors", visitors),
                                        new MySqlParameter("@idbesucher", _idBesucher)
                                });
                                //await SQL.WriteSQL($"UPDATE {MainWindow.table}.besucher SET Anzahl_Begleitpersonen = '{count}' WHERE idbesucher = '{_idBesucher}'");
                                await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.besucher SET Anzahl_Begleitpersonen = @count WHERE idbesucher = @idbesucher", new List<MySqlParameter>()
                                {
                                        new MySqlParameter("@count", count),
                                        new MySqlParameter("@idbesucher", _idBesucher)
                                });
                            }
                            else
                            {
                                //await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.besucherGroups (besucherList, idbesucher) VALUES ('{visitors}','{_idBesucher}')");
                                GroupID = await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.besucherGroups (besucherList, idbesucher) VALUES (@visitors,@idbesucher)", new List<MySqlParameter>()
                                {
                                        new MySqlParameter("@visitors", visitors),
                                        new MySqlParameter("@idbesucher", _idBesucher)
                                });

                                //await SQL.WriteSQL($"UPDATE {MainWindow.table}.besucher SET Anzahl_Begleitpersonen = '{count}' WHERE idbesucher = '{_idBesucher}'");
                                await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.besucher SET Anzahl_Begleitpersonen = @count WHERE idbesucher = @idbesucher", new List<MySqlParameter>()
                                {
                                        new MySqlParameter("@count", count),
                                        new MySqlParameter("@idbesucher", _idBesucher)
                                });
                            }
                        }
                    }
                    else
                        //await SQL.WriteSQL($"Insert INTO {MainWindow.table}.besucherGroups (besucherList) VALUES ('{visitors}')");
                        GroupID = await SQL.CreateAndWriteSQL($"INSERT INTO {MainWindow.table}.besucherGroups (besucherList, idbesucher) VALUES (@visitors,@idbesucher)", new List<MySqlParameter>()
                                {
                                        new MySqlParameter("@visitors", visitors),
                                        new MySqlParameter("@idbesucher", _idBesucher)
                                });
                }
                else
                {
                    var msgResult = MessageBox.Show("Es wurden keine Personen angegeben!\nDie Anzahl der Personen wird somit auf 0 gesetzt\nEs wird dann nur die Person die bei 'Name des Besuchers' eingetragen wurde eingelassen!", "Keine Angaben", MessageBoxButton.OKCancel, MessageBoxImage.Error);

                    if (MessageBoxResult.OK == msgResult)
                    {
                        if (SQL.RowExists(MainWindow.table.ToString() + ".besucherGroups", "idbesucher", _idBesucher.ToString()).Result)
                        {
                            await SQL.WriteSQL($"DELETE FROM {MainWindow.table}.besucherGroups WHERE idbesucher = '{_idBesucher}'");
                            //await SQL.WriteSQL($"UPDATE {MainWindow.table}.besucher SET Anzahl_Begleitpersonen = '0' WHERE idbesucher = '{_idBesucher}'");
                            await SQL.CreateAndWriteSQL($"UPDATE {MainWindow.table}.besucher SET Anzahl_Begleitpersonen = 0 WHERE idbesucher = @_idBesucher", new List<MySqlParameter>()
                                                        {
                                                            new MySqlParameter("@_idBesucher", _idBesucher)
                                                        });
                        }
                    }
                    else if (MessageBoxResult.Cancel == msgResult)
                    {
                        return false;
                    }
                }
                //GroupID = Convert.ToInt32(SQL.ReadSingleValue($"SELECT LAST_INSERT_ID()"));

                this.DialogResult = true;
                return true;
            }
            catch (Exception ex)
            {
                Log.WriteLog(ex.ToString());
                MessageBox.Show("Es ist ein Fehler beim hinzufügen der Besucher aufgetreten, bitte erneut versuchen", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }
        }

        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            bool zeroPanels = false;
            WrapPanel wrapPanel = new WrapPanel
            {
                Orientation = Orientation.Vertical,  // Jedes WrapPanel wird vertikal sein
                Margin = new Thickness(10),
                Width = 300
            };

            if (Helper.FindVisualChildren<WrapPanel>(spGroup).Count() > 0)
            {
                wrapPanel = Helper.FindVisualChildren<WrapPanel>(spGroup).Last();
            }
            else
                zeroPanels = true;

            var nr = Helper.FindVisualChildren<TextBox>(spGroup).Count();

            var sp = new StackPanel();
            var lbl = new TextBlock() { Text = $"Begleitperson Nr. {nr + 1}:", Margin = new Thickness(5), Height = 20 };
            lbl.SetResourceReference(Control.ForegroundProperty, SystemColors.ControlTextBrushKey);
            sp.Children.Add(lbl);
            var tb = new TextBox() { Margin = new Thickness(10, 0, 10, 0), Height = 30, Width = 280, ToolTip = "Um eine Person zu entfernen, Feld leer lassen" };
            ToolTipService.SetInitialShowDelay(tb, 200);
            MahApps.Metro.Controls.TextBoxHelper.SetWatermark(tb, "Vorname Nachname");
            sp.Children.Add(tb);


            wrapPanel.Children.Add(sp);
            this.Height = this.Height + 60;
            // Das WrapPanel zum StackPanel hinzufügen

            if (zeroPanels)
            {
                spGroup.Children.Add(wrapPanel);
                this.Height = this.Height + 20;
                zeroPanels = false;
            }

            //width = (columnCount * 320) + 10;
        }

        private void btnRemove_Click(object sender, RoutedEventArgs e)
        {
            if ((spGroup.Children[0] as WrapPanel).Children.Count > 0)
            {
                (spGroup.Children[0] as WrapPanel).Children.RemoveAt((spGroup.Children[0] as WrapPanel).Children.Count - 1);
                this.Height = this.Height - 60;
            }
        }



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

        private async void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            var legit = await SendIt();
            if (!legit) e.Cancel = true;
        }
    }
}
