using SdbS.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
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.Navigation;
using System.Windows.Shapes;
using System.Data.SqlClient;
using static System.Net.Mime.MediaTypeNames;
using Microsoft.Win32;

namespace SdbS.View_Manager.Pages
{
    /// <summary>
    /// Логика взаимодействия для ManufacturedMachines.xaml
    /// </summary>
    public partial class ManufacturedMachines : Page
    {

        /* Класс со свойствами для передачи их данных в кастомный ListBox */
        public class DataMachines
        {
            public string Name { get; set; }
            public string Type { get; set; }
            public string Photo { get; set; }
            public System.DateTime MakingDate { get; set; }

            // Создание временного списка для поиска 
            public static List<object> tempItems = new List<object>();
        }

        /* Объявление объекта для работы с моделью БД */
        readonly Entities entities = new Entities();

        public ManufacturedMachines()
        { 
            InitializeComponent();

            // Передача reader`а в переменную для чтения данных из таблицы //
            SqlDataReader reader = Relation_MachinesAndType.GetReader_DefaultListBox();

            // Формирование списка для ListBox
            while (reader.Read())
            {
                listBox_ManufacturedMachines.Items.Add(
                new DataMachines()
                {
                    Name = reader["nameMachine"].ToString(),
                    Type = reader["name"].ToString(),
                    MakingDate = DateTime.Parse(reader["makingDate"].ToString()),
                } );
            }

            reader.Close();
            CommonClass.GetConnection().Close();

            // Передача общего кол-ва записей в TextBlock 
            textBlock_AllCountRecords.Text = "(" + listBox_ManufacturedMachines.Items.Count.ToString() + ")";

            // Объявление списка для ComboBox, хранящего значения типов станков 
            List<Model.TypeMachine> typeMachines = new List<Model.TypeMachine>();

            // Формирование списка для ComboBox (поиск и тот что справа) //
            foreach (var record in entities.TypeMachine)
                typeMachines.Add(record);

            // ComboBox - Поиск 
            comboBox_SearxMachines.ItemsSource = typeMachines;
            comboBox_SearxMachines.SelectedValuePath = "typeMachine_ID";
            comboBox_SearxMachines.DisplayMemberPath = "name";

            // CombobBox - Справа 
            comboBox_TypeMachine.ItemsSource = typeMachines;
            comboBox_TypeMachine.SelectedValuePath = "typeMachine_ID";
            comboBox_TypeMachine.DisplayMemberPath = "name";
        }

        /* МЕТОД ПОИСКА ЧЕРЕЗ ПОЛЕ 'TextBox' */
        private void textBox_SearxMachines_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (textBox_SearxMachines.Text.Length > 0)
            {
                SqlDataReader reader = Relation_MachinesAndType.GetReader_DefaultListBox();

                while (reader.Read())
                {
                    string nameMachine = reader["nameMachine"].ToString();

                    // Поиск совпадений. Если есть, то передаем 1, иначе 0
                    int matches = Regex.Match(nameMachine.ToLower(), textBox_SearxMachines.Text.ToLower()).Length;

                    // Если 1, то создаем новый Item 
                    if (matches > 0)
                    {
                        DataMachines.tempItems.Add(
                        new DataMachines()
                        {
                            Name = reader["nameMachine"].ToString(),
                            Type = reader["name"].ToString(),
                            MakingDate = DateTime.Parse(reader["makingDate"].ToString()),
                        } );
                    }
                }

                reader.Close();
                CommonClass.GetConnection().Close();

                // Очистка ListBox 
                listBox_ManufacturedMachines.ItemsSource = null;
                listBox_ManufacturedMachines.Items.Clear();

                // Передача новых Items`s в ListBox 
                foreach (var item in DataMachines.tempItems)
                    listBox_ManufacturedMachines.Items.Add(item);

                // Показ кол-ва найденных записей 
                textBlock_SearxCountMachines.Visibility = Visibility.Visible;
                textBlock_SearxCountMachines.Text = $"Найдено записей ({listBox_ManufacturedMachines.Items.Count})";

                DataMachines.tempItems.Clear();

                return;
            }

            // Если TextBox пуст, то возвращаем все как было //
            listBox_ManufacturedMachines.ItemsSource = null;
            listBox_ManufacturedMachines.Items.Clear();
            textBlock_SearxCountMachines.Visibility = Visibility.Hidden;
            comboBox_SearxMachines.SelectedIndex = -1;

            SqlDataReader readerRefund = Relation_MachinesAndType.GetReader_DefaultListBox();

            while (readerRefund.Read())
            {
                listBox_ManufacturedMachines.Items.Add(
                new DataMachines()
                {
                    Name = readerRefund["nameMachine"].ToString(),
                    Type = readerRefund["name"].ToString(),
                    MakingDate = DateTime.Parse(readerRefund["makingDate"].ToString()),
                } );
            }

            readerRefund.Close();
            CommonClass.GetConnection().Close();

        }

        /* МЕТОД ПОИСКА ЧЕРЕЗ ПОЛЕ 'ComboBox' */
        private void comboBox_SearxMachines_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            int index = comboBox_SearxMachines.SelectedIndex + 1;

            // Передача reader`a 
            SqlDataReader reader = Relation_MachinesAndType.GetReader_ComboBoxSearch(index);

            // Формирование временного списка 
            while (reader.Read())
            {
                DataMachines.tempItems.Add(
                new DataMachines()
                {
                    Name = reader["nameMachine"].ToString(),
                    Type = reader["name"].ToString(),
                    MakingDate = DateTime.Parse(reader["makingDate"].ToString()),
                } );
            }

            // Очистка ListBox 
            listBox_ManufacturedMachines.ItemsSource = null;
            listBox_ManufacturedMachines.Items.Clear();

            // Формирование нового ListBox 
            foreach (var item in DataMachines.tempItems)
                listBox_ManufacturedMachines.Items.Add(item);

            // Показ кол-ва найденных записей 
            textBlock_SearxCountMachines.Visibility = Visibility.Visible;
            textBlock_SearxCountMachines.Text = $"Найдено записей ({listBox_ManufacturedMachines.Items.Count})";

            // Удаление элементов из списка 
            DataMachines.tempItems.Clear();
            
            reader.Close();
            CommonClass.GetConnection().Close();
        }

        /* МЕТОД СБРОСА ДЕЙСТВИЙ С ПОИСКОМ 'ComboBox' и 'TextBox' */
        private void button_Drop_ComboBoxAndListBox_Click(object sender, RoutedEventArgs e)
        {
            comboBox_SearxMachines.SelectedIndex = -1;
            textBox_SearxMachines.Text = "";

            listBox_ManufacturedMachines.ItemsSource = null;
            listBox_ManufacturedMachines.Items.Clear();
            textBlock_SearxCountMachines.Visibility = Visibility.Hidden;

            SqlDataReader readerRefund = Relation_MachinesAndType.GetReader_DefaultListBox();

            while (readerRefund.Read())
            {
                listBox_ManufacturedMachines.Items.Add(
                new DataMachines()
                {
                    Name = readerRefund["nameMachine"].ToString(),
                    Type = readerRefund["name"].ToString(),
                    MakingDate = DateTime.Parse(readerRefund["makingDate"].ToString()),
                } );
            }
            readerRefund.Close();
            CommonClass.GetConnection().Close();
        }

        /* МЕТОД ПОЛНОГО СБРОСА ПО КНОПКЕ */
        private void button_DropFields_Click(object sender, RoutedEventArgs e)
        {
            comboBox_SearxMachines.SelectedIndex = -1;
            textBox_SearxMachines.Text = "";
            comboBox_TypeMachine.SelectedIndex = -1;
            textBox_NameMachine.Text = "";
            datePicker_ManufacturedMachines.Text = "";
            image_ManufacturedMachine.Source = BitmapFrame.Create(new Uri(@"C:\Users\User\Desktop\SdbS\SdbS\Images\Machine\notPhoto.png", UriKind.Absolute));

            listBox_ManufacturedMachines.ItemsSource = null;
            listBox_ManufacturedMachines.Items.Clear();
            textBlock_SearxCountMachines.Visibility = Visibility.Hidden;

            SqlDataReader readerRefund = Relation_MachinesAndType.GetReader_DefaultListBox();

            while (readerRefund.Read())
            {
                listBox_ManufacturedMachines.Items.Add(
                new DataMachines()
                {
                    Name = readerRefund["nameMachine"].ToString(),
                    Type = readerRefund["name"].ToString(),
                    MakingDate = DateTime.Parse(readerRefund["makingDate"].ToString()),
                } );
            }
            readerRefund.Close();
            CommonClass.GetConnection().Close();

            button_EditPhoto.IsEnabled = false;
            button_EditMachine.IsEnabled = false;
            button_DeleteMachine.IsEnabled = false; 
            button_AddMachine.IsEnabled = true;
        }

        /* МЕТОД ОТОБРАЖЕНИЯ ДАННЫХ ИЗ 'ListBox' НА ЭЛЕМЕНТЫ */
        private void listBox_ManufacturedMachines_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            button_EditMachine.IsEnabled = true;
            button_DeleteMachine.IsEnabled = true;
            button_EditPhoto.IsEnabled = true;
            button_AddMachine.IsEnabled = false;

            int selectIndex = listBox_ManufacturedMachines.SelectedIndex;

            if (selectIndex != -1 && (textBox_SearxMachines.Text != "" || comboBox_SearxMachines.SelectedIndex != -1))
            {
                textBox_NameMachine.Text = "";
                comboBox_TypeMachine.SelectedItem = -1;
                datePicker_ManufacturedMachines.Text = "";

                button_EditMachine.IsEnabled = false;
            }

            else
            {
                button_EditMachine.IsEnabled = true;
                selectIndex++;

                SqlDataReader reader = Relation_MachinesAndType.GetReader_ListBoxSelect(selectIndex);

                while (reader.Read())
                {
                    textBox_NameMachine.Text = reader["nameMachine"].ToString();

                    if (reader["photo"].ToString() == "")
                        image_ManufacturedMachine.Source = BitmapFrame.Create(new Uri(@"C:\Users\User\Desktop\SdbS\SdbS\Images\Machine\notPhoto.png", UriKind.Absolute));
                    else
                        image_ManufacturedMachine.Source = BitmapFrame.Create(new Uri(reader["photo"].ToString(), UriKind.Absolute));

                    comboBox_TypeMachine.SelectedIndex = Convert.ToInt32(reader["typeMachine_ID"]) - 1;
                    datePicker_ManufacturedMachines.Text = Convert.ToDateTime(reader["makingDate"]).ToString();
                }
                reader.Close();
                CommonClass.GetConnection().Close();
            }
 
        }

        /* МЕТОД РЕДАКТИРОВАНИЯ СТРОКИ В ТАБЛИЦЕ 'Станки' */
        private void button_EditMachine_Click(object sender, RoutedEventArgs e)
        {
            if (textBox_NameMachine.Text != "" &&
                comboBox_TypeMachine.SelectedIndex != -1 &&
                datePicker_ManufacturedMachines.Text != "")
            {
                var rezult = MessageBox.Show("Вы уверены?", "Изменение строки", MessageBoxButton.YesNo,
                                          MessageBoxImage.Question);

                if (rezult == MessageBoxResult.No)
                    return;

                else
                {
                    int selectIndex = listBox_ManufacturedMachines.SelectedIndex + 1;

                    int typeMachine = comboBox_TypeMachine.SelectedIndex + 1;
                    string nameMachine = textBox_NameMachine.Text;
                    string makingDate = datePicker_ManufacturedMachines.Text;

                    Relation_MachinesAndType.EditMachine(typeMachine, selectIndex, nameMachine, makingDate);

                    listBox_ManufacturedMachines.ItemsSource = null;
                    listBox_ManufacturedMachines.Items.Clear();

                    SqlDataReader readerRefund = Relation_MachinesAndType.GetReader_DefaultListBox();

                    while (readerRefund.Read())
                    {
                        listBox_ManufacturedMachines.Items.Add(
                        new DataMachines()
                        {
                            Name = readerRefund["nameMachine"].ToString(),
                            Type = readerRefund["name"].ToString(),
                            MakingDate = DateTime.Parse(readerRefund["makingDate"].ToString()),
                        } );
                    }
                    readerRefund.Close();
                    CommonClass.GetConnection().Close();

                    // Передача общего кол-ва записей в TextBlock 
                    textBlock_AllCountRecords.Text = "(" + listBox_ManufacturedMachines.Items.Count.ToString() + ")";
                }
            }

            else MessageBox.Show("Необходимо заполнить поля данными! (нажмите по любой строке)",
                                 "Ой-ой, не торопись!", MessageBoxButton.OK, MessageBoxImage.Warning);
        }

        /* МЕТОД ДОБАВЛЕНИЯ СТРОКИ В ТАБЛИЦУ "Станки" */
        private void button_AddMachine_Click(object sender, RoutedEventArgs e)
        {
            if (textBox_NameMachine.Text != "" &&
                comboBox_TypeMachine.SelectedIndex != -1 &&
                datePicker_ManufacturedMachines.Text != "")
            {
                var rezult = MessageBox.Show("Вы уверены?", "Добавление новой строки", MessageBoxButton.YesNo,
                                          MessageBoxImage.Question);

                if (rezult == MessageBoxResult.No)
                    return;

                else
                {
                    int ID = listBox_ManufacturedMachines.Items.Count + 1;
                    int typeMachine = comboBox_TypeMachine.SelectedIndex + 1;
                    string nameMachine = textBox_NameMachine.Text;
                    string makingDate = datePicker_ManufacturedMachines.Text;

                    Relation_MachinesAndType.AddMachine(ID, typeMachine, nameMachine, makingDate);

                    listBox_ManufacturedMachines.ItemsSource = null;
                    listBox_ManufacturedMachines.Items.Clear();

                    SqlDataReader readerRefund = Relation_MachinesAndType.GetReader_DefaultListBox();

                    while (readerRefund.Read())
                    {
                        listBox_ManufacturedMachines.Items.Add(
                        new DataMachines()
                        {
                            Name = readerRefund["nameMachine"].ToString(),
                            Type = readerRefund["name"].ToString(),
                            MakingDate = DateTime.Parse(readerRefund["makingDate"].ToString()),
                        } );
                    }
                    readerRefund.Close();
                    CommonClass.GetConnection().Close();

                    // Передача общего кол-ва записей в TextBlock /
                    textBlock_AllCountRecords.Text = "(" + listBox_ManufacturedMachines.Items.Count.ToString() + ")";
                }
            }

            else MessageBox.Show("Необходимо заполнить поля данными!",
                                 "Ой-ой, не торопись!", MessageBoxButton.OK, MessageBoxImage.Warning);
        }

        /* МЕТОД УДАЛЕНИЯ СТРОКИ ИЗ ТАБЛИЦЫ 'Станки' */
        private void button_DeleteMachine_Click(object sender, RoutedEventArgs e)
        {
            var rezult = MessageBox.Show("Вы уверены?", "Удаление", MessageBoxButton.YesNo,
                                          MessageBoxImage.Question);

            if (rezult == MessageBoxResult.No)
                return;

            else
            {
                int selectIndex = listBox_ManufacturedMachines.SelectedIndex + 1;

                // Вызов метода для удаления строки
                Relation_MachinesAndType.DeleteMachine(selectIndex);

                listBox_ManufacturedMachines.ItemsSource = null;
                listBox_ManufacturedMachines.Items.Clear();

                // Обновление ListBox 
                SqlDataReader readerRefund = Relation_MachinesAndType.GetReader_DefaultListBox();

                while (readerRefund.Read())
                {
                    listBox_ManufacturedMachines.Items.Add(
                    new DataMachines()
                    {
                        Name = readerRefund["nameMachine"].ToString(),
                        Type = readerRefund["name"].ToString(),
                        MakingDate = DateTime.Parse(readerRefund["makingDate"].ToString()),
                    } );
                }
                readerRefund.Close();
                CommonClass.GetConnection().Close();

                textBlock_AllCountRecords.Text = "(" + listBox_ManufacturedMachines.Items.Count.ToString() + ")";   
            }
        }

        /* МЕТОД ИЗМЕНЕНИЯ ФОТО СТАНКА */
        private void button_EditPhoto_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog
            {
                Multiselect = false,
                Filter = "Image files (*.png; *.jpeg)| *.png; *.jpeg",
                InitialDirectory = @"C:\Users\User\Desktop\SdbS\SdbS\Images\Machine\"
            };

            if (openFileDialog.ShowDialog() == true)
            {
                string filePath = openFileDialog.FileName;
                int selectIndex = listBox_ManufacturedMachines.SelectedIndex + 1;

                Relation_MachinesAndType.UpdateImage(selectIndex, filePath);

                listBox_ManufacturedMachines.ItemsSource = null;
                listBox_ManufacturedMachines.Items.Clear();

                // Обновление ListBox 
                SqlDataReader readerRefund = Relation_MachinesAndType.GetReader_DefaultListBox();

                while (readerRefund.Read())
                {
                    listBox_ManufacturedMachines.Items.Add(
                    new DataMachines()
                    {
                        Name = readerRefund["nameMachine"].ToString(),
                        Type = readerRefund["name"].ToString(),
                        MakingDate = DateTime.Parse(readerRefund["makingDate"].ToString()),
                    });
                }
                readerRefund.Close();
                CommonClass.GetConnection().Close();

                SqlDataReader reader = Relation_MachinesAndType.GetReader_ListBoxSelect(selectIndex);

                while (reader.Read())
                    image_ManufacturedMachine.Source = BitmapFrame.Create(new Uri(reader["photo"].ToString(), UriKind.Absolute));

                reader.Close();
                CommonClass.GetConnection().Close();
            }       
        }
    }
}
