using MahApps.Metro.Controls;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Runtime.CompilerServices;
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 ManageAsp.xaml
    /// </summary>
    public partial class ManageAsp : MetroWindow
    {
        public event PropertyChangedEventHandler PropertyChanged;

        //private List<Asp> myVar;
        //public List<Asp> aspView
        //{
        //    get { return myVar; }
        //    set { myVar = value; }
        //}

        DataTable asp = new DataTable("Asp");
        string UserID = "0";

        public ManageAsp()
        {
            this.DataContext = this;

            InitializeComponent();

            UserID = SQL.ReadSingleValue($"SELECT idusers FROM {MainWindow.table}.users WHERE Username = '{Environment.UserName}'");

            Query();
        }

        private void Query()
        {
            if (MainWindow.LoggedInRole == Roles.Admin)
            {
                asp = SQL.ReadSQL($"SELECT * FROM {MainWindow.table}.ansprechpartner ORDER BY Name ASC", asp).Result;
            }
            else
            {
                asp = SQL.ReadSQL($"SELECT * FROM {MainWindow.table}.ansprechpartner WHERE Name LIKE '%{Helper.InsertSpaceBeforeUpperCase(Environment.UserName)}%' OR Vertreter LIKE '%{Helper.InsertSpaceBeforeUpperCase(Environment.UserName)}%' OR Vorgesetzter LIKE '%{Helper.InsertSpaceBeforeUpperCase(Environment.UserName)}%' OR CreatorID = '{UserID}' ORDER BY Name ASC", asp).Result;
            }

            //aspView = Asp.DataTableToAsp(asp);
            dgAsp.DataContext = asp;
        }

        private async void BtnCreateAsp_Click(object sender, RoutedEventArgs e)
        {
            if (string.IsNullOrWhiteSpace(tbAsp.Text) || tbAsp.Text.ToList<char>().Distinct().Count() < 5)
                MessageBox.Show(this, "Ansprechpartner muss qualifiziert ausgefüllt sein!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            else if (string.IsNullOrWhiteSpace(tbAspVertreter.Text) || tbAspVertreter.Text.ToList<char>().Distinct().Count() < 5)
                MessageBox.Show(this, "Vertreter muss qualifiziert ausgefüllt sein!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            else if (string.IsNullOrWhiteSpace(tbAspVorgesetzter.Text) || tbAspVorgesetzter.Text.ToList<char>().Distinct().Count() < 5)
                MessageBox.Show(this, "Vorgesetzter muss qualifiziert ausgefüllt sein!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            else if (string.IsNullOrWhiteSpace(tbAspTel.Text) || !System.Text.RegularExpressions.Regex.IsMatch(tbAspTel.Text, "^[0-9()+\\-/ ]*$") || tbAspTel.Text.ToList<char>().Distinct().Count() < 5)
                MessageBox.Show(this, "Ansprechpartner-Telefonnummer muss qualifiziert ausgefüllt sein!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            else if (string.IsNullOrWhiteSpace(tbVertreterTel.Text) || !System.Text.RegularExpressions.Regex.IsMatch(tbAspTel.Text, "^[0-9()+\\-/ ]*$") || tbVertreterTel.Text.ToList<char>().Distinct().Count() < 5)
                MessageBox.Show(this, "Vertreter-Telefonnummer muss qualifiziert ausgefüllt sein!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            else if (string.IsNullOrWhiteSpace(tbVorgesetzterTel.Text) || !System.Text.RegularExpressions.Regex.IsMatch(tbVertreterTel.Text, "^[0-9()+\\-/ ]*$") || tbVertreterTel.Text.ToList<char>().Distinct().Count() < 5)
                MessageBox.Show(this, "Vorgesetzter-Telefonnummer muss qualifiziert ausgefüllt sein!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            else
            {
                await SQL.WriteSQL($"INSERT INTO {MainWindow.table}.ansprechpartner (Name,Vertreter,Tel_Nr,Vorgesetzter,Tel_Vertreter,Tel_Vorgesetzter,CreatorID) VALUES " +
                                    $"('{tbAsp.Text}','{tbAspVertreter.Text}','{tbAspTel.Text}','{tbAspVorgesetzter.Text}','{tbVertreterTel.Text}','{tbVorgesetzterTel.Text}','{UserID}')");

                tbAsp.Text = "";
                tbAspTel.Text = "";
                tbAspVertreter.Text = "";
                tbAspVorgesetzter.Text = "";
                tbVertreterTel.Text = "";
                tbVorgesetzterTel.Text = "";

                Query();
            }
        }
        private async void DgAsp_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Delete)
            {
                var dg = sender as DataGrid;
                var row = dg.SelectedItem as DataRowView;
                var arr = row.Row.ItemArray;


                if (arr[0].ToString() == Helper.InsertSpaceBeforeUpperCase(Environment.UserName) || arr[6].ToString() == UserID)
                {
                    await SQL.WriteSQL($"DELETE FROM {MainWindow.table}.ansprechpartner WHERE `Name` = '{arr[0]}'");

                    Query();
                }
            }
        }


        private void DgAsp_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            dgAsp.PreviewKeyDown -= DgAsp_PreviewKeyDown;
        }
        private async void DgAsp_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            var header = e.Column.Header;
            var newValue = (e.EditingElement as TextBox).Text;
            var name = (e.Row.Item as DataRowView).Row.ItemArray[0];


            switch (header)
            {
                case "Ansprechpartner":
                    await SQL.WriteSQL($"UPDATE {MainWindow.table}.ansprechpartner SET Name = '{newValue}', CreatorID = '{UserID}' WHERE Name = '{name}'");
                    break;
                case "Asp-Vertreter":
                    await SQL.WriteSQL($"UPDATE {MainWindow.table}.ansprechpartner SET Vertreter = '{newValue}', CreatorID = '{UserID}' WHERE Name = '{name}'");
                    break;
                case "Asp-Tel":
                    await SQL.WriteSQL($"UPDATE {MainWindow.table}.ansprechpartner SET Tel_Nr = '{newValue}', CreatorID = '{UserID}' WHERE Name = '{name}'");
                    break;
                case "Asp-Vorgesetzter":
                    await SQL.WriteSQL($"UPDATE {MainWindow.table}.ansprechpartner SET Vorgesetzter = '{newValue}', CreatorID = '{UserID}' WHERE Name = '{name}'");
                    break;
                case "Vertreter-Tel":
                    await SQL.WriteSQL($"UPDATE {MainWindow.table}.ansprechpartner SET Tel_Vertreter = '{newValue}', CreatorID = '{UserID}' WHERE Name = '{name}'");
                    break;
                case "Vorgesetzter-Tel":
                    await SQL.WriteSQL($"UPDATE {MainWindow.table}.ansprechpartner SET Tel_Vorgesetzter = '{newValue}', CreatorID = '{UserID}' WHERE Name = '{name}'");
                    break;

            }

            dgAsp.RowValidationErrorTemplate = new ControlTemplate();
            dgAsp.PreviewKeyDown += DgAsp_PreviewKeyDown;

            Query();
        }

        private void DelButton_Loaded(object sender, RoutedEventArgs e)
        {
            var btn = sender as Button;
            var arr = (btn.DataContext as DataRowView).Row.ItemArray;
            var user = arr[0].ToString();

            if (MainWindow.LoggedInRole != Roles.Admin)
            {
                if (arr[0].ToString() == Helper.InsertSpaceBeforeUpperCase(Environment.UserName) || arr[6].ToString() == UserID)
                {
                    btn.IsEnabled = true;
                    btn.Foreground = new SolidColorBrush(Colors.Red);
                    btn.ToolTip = $"Eintrag löschen";
                }
                else
                {
                    btn.IsEnabled = false;
                    btn.Foreground = new SolidColorBrush(Colors.Gray);
                    btn.ToolTip = $"Gesperrt durch {user}";
                }
            }
        }
        private async void DeleteButton_Click(object sender, RoutedEventArgs e)
        {
            var arr = ((sender as Button).DataContext as DataRowView).Row.ItemArray;

            if (MessageBoxResult.Yes == MessageBox.Show($"Wollen Sie den Eintrag für {arr[0]} sicher löschen?", "Eintrag löschen?", MessageBoxButton.YesNoCancel, MessageBoxImage.Question))
            {
                Cursor = Cursors.Wait;

                try
                {
                    await SQL.WriteSQL($"DELETE FROM {MainWindow.table}.ansprechpartner WHERE Name = '{arr[0]}' OR CreatorID = '{UserID}'");
                }
                catch (Exception ex)
                {
                    Log.WriteLog(ex.ToString());
                    MessageBox.Show("Es ist ein Fehler beim löschen aufgetreten, bitte erneut versuchen", "Fehler beim Löschen", MessageBoxButton.OK, MessageBoxImage.Error);
                }

                Query();
            }
        }

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

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



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

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

    //public class Asp
    //{
    //    string Name;
    //    string Vertreter;
    //    string Tel_Nr;
    //    string Vorgesetzter;
    //    string Tel_Vertreter;
    //    string Tel_Vorgesetzter;


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

    //        foreach (DataRow dr in dataTable.Rows)
    //        {
    //            x.Add(new Asp()
    //            {
    //                Name = dr[0].ToString(),
    //                Vertreter = dr[1].ToString(),
    //                Tel_Nr = dr[2].ToString(),
    //                Vorgesetzter = dr[3].ToString(),
    //                Tel_Vertreter = dr[4].ToString(),
    //                Tel_Vorgesetzter = dr[5].ToString()
    //            });
    //        }

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