using System;
using System.Collections.Generic;
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.Navigation;
using System.Windows.Shapes;
using static System.Collections.Specialized.BitVector32;

namespace Control_DB_Railway.Views
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Entities entities = new Entities();

        public MainWindow()
        {
            InitializeComponent();

            // Заполнение ListBox из таблицы "Станции"   
            foreach (var row_Station in entities.Stations)
                listBox_Station.Items.Add(row_Station);

            // Заполнение ListBox из таблицы "Тип станции"
            foreach (var row_TypeStation in entities.TypeStation)
                listBox_TypeStation.Items.Add(row_TypeStation);

            // Заполнение ListBox из таблицы "Дороги"
            foreach (var row_Roads in entities.Roads)
                listBox_Road.Items.Add(row_Roads);

            // Заполнение comboBox_TypeStation из таблицы "Тип станции"
            foreach (var element_TypeStationID in entities.TypeStation)
                comboBox_TypeStation.Items.Add(element_TypeStationID);

        }


        /********************/
        /* ОБЪЕКТ "СТАНЦИЯ" */
        /********************/

        /* Отображение информации в поля "Станция" */
        private void listBox_Station_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var selectStation = listBox_Station.SelectedItem as Stations;

            if (selectStation != null) 
            {
                textBox_Station.Text = selectStation.nameStation;
                checkBox_overheadTransition.IsChecked = selectStation.overheadTransition;
                textBox_Location.Text = selectStation.location;
                comboBox_TypeStation.SelectedItem = (from type in entities.TypeStation
                                                     where type.typeStationID == selectStation.typeStationID
                                                     select type).Single<TypeStation>();
            } 
            else 
            {
                textBox_Station.Text = "";
                checkBox_overheadTransition.IsChecked = false;
                textBox_Location.Text = "";
                comboBox_TypeStation.SelectedIndex = -1;
            }
        }

        /* Нажатие по кнопке "Добавить/изменить станцию" */
        private void button_AddRecord_Station_Click(object sender, RoutedEventArgs e)
        {
            var station = listBox_Station.SelectedItem as Stations;

            if (textBox_Station.Text == "" ||
                comboBox_TypeStation.SelectedIndex == -1 ||
                textBox_Location.Text == "")
                MessageBox.Show("Заполните все поля!", "Ошибка!", MessageBoxButton.OK,
                                 MessageBoxImage.Error);

            else
            {
                if (station == null)
                {
                    station = new Stations();
                    entities.Stations.Add(station);         // добавляем запись в БД
                    listBox_Station.Items.Add(station);     // добавляем запись в ListBox
                }

                station.nameStation = textBox_Station.Text;
                station.overheadTransition = (bool)checkBox_overheadTransition.IsChecked;
                station.location = textBox_Location.Text;
                station.typeStationID = (comboBox_TypeStation.SelectedItem as TypeStation).typeStationID;

                entities.SaveChanges();
                listBox_Station.Items.Refresh();

                MessageBox.Show("Успешное сохранение/добавление записи!", "Оповещение",
                                MessageBoxButton.OK, MessageBoxImage.Information);
            }

        }                       
        

        /* Удаление записи "Станции" */
        private void button_DeleteRecord_Station_Click(object sender, RoutedEventArgs e)
        {
            var rezult = MessageBox.Show("Вы уверены, что хотите удалить запись?", "Удаление", 
                                          MessageBoxButton.YesNo, MessageBoxImage.Question);

            if (rezult == MessageBoxResult.No)
                return;

            var delete_station = listBox_Station.SelectedItem as Stations;

            if (delete_station != null)
            {
                listBox_Station.Items.Remove(delete_station);
                checkBox_overheadTransition.IsChecked = false;
                textBox_Station.Clear();
                textBox_Location.Clear();

                entities.Stations.Remove(delete_station);
                entities.SaveChanges();
            }
            else
                MessageBox.Show("Нет удаляемых объектов!", "Ошибка", MessageBoxButton.OK,
                                 MessageBoxImage.Warning);
        }

        /* Очистка полей "Станции" */
        private void button_ClearStation_Click(object sender, RoutedEventArgs e)
        {
            textBox_Station.Text = "";
            checkBox_overheadTransition.IsChecked = false;
            comboBox_TypeStation.SelectedIndex = -1;
            listBox_Station.SelectedIndex = -1;

            textBox_Station.Focus();
        }


        /************************/
        /* ОБЪЕКТ "ТИП СТАНЦИИ" */
        /************************/

        /* Отображение информации в поля "Тип станции" */
        private void listBox_TypeStation_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var selectTypeStation = listBox_TypeStation.SelectedItem as TypeStation;

            if (selectTypeStation != null)
            {
                textBox_TypeStation.Text = selectTypeStation.nameTypeStation;
                checkBox_passagerService.IsChecked = selectTypeStation.passagerService;
            }
            else
            {
                textBox_TypeStation.Text = "";
                checkBox_passagerService.IsChecked = false;
            }
        }

        /* Добавление/сохранение записи в "Типе станции" */
        private void button_AddRecord_TypeStation_Click(object sender, RoutedEventArgs e)
        {
            var typeStation = listBox_TypeStation.SelectedItem as TypeStation;

            if (textBox_TypeStation.Text == "")
                MessageBox.Show("Напишите название!", "Ошибка!", MessageBoxButton.OK,
                                 MessageBoxImage.Error);
            else
            {
                if (typeStation == null)
                {
                    typeStation = new TypeStation();
                    entities.TypeStation.Add(typeStation);         // добавляем запись в БД
                    listBox_TypeStation.Items.Add(typeStation);    // добавляем запись в ListBox
                }

                typeStation.nameTypeStation = textBox_TypeStation.Text;
                typeStation.passagerService = (bool)checkBox_passagerService.IsChecked;

                entities.SaveChanges();
                listBox_TypeStation.Items.Refresh();

                MessageBox.Show("Успешное сохранение/добавление записи!", "Оповещение",
                                MessageBoxButton.OK, MessageBoxImage.Information);
                MessageBox.Show("Для приминения изменений необходимо перезапустить ИС",
                                "Оповещение", MessageBoxButton.OK, MessageBoxImage.Information);

                Authorization showAuthorization = new Authorization();
                showAuthorization.Show();
                this.Close();
            }
        }

        /* Удаление записи "Тип станции" */
        private void button_DeleteRecord_TypeStation_Click(object sender, RoutedEventArgs e)
        {
            var delete_typeStation = listBox_TypeStation.SelectedItem as TypeStation;

            try
            {
                // Проверка на наличие записи с дочерней таблице //
                var exist_ = (from structure in entities.Stations
                              where structure.typeStationID == delete_typeStation.typeStationID
                              select structure).First();

                // Если запись найдена, то: //
                MessageBox.Show("Запись удалить нельзя!\nСуществуют станции данного типа",
                                "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
            } 
            catch
            {
                var rezult = MessageBox.Show("Вы уверены, что хотите удалить запись?", "Удаление",
                                          MessageBoxButton.YesNo, MessageBoxImage.Question);

                if (rezult == MessageBoxResult.No)
                    return;

                if (delete_typeStation != null)
                {
                    listBox_TypeStation.Items.Remove(delete_typeStation);
                    checkBox_passagerService.IsChecked = false;
                    textBox_TypeStation.Clear();

                    entities.TypeStation.Remove(delete_typeStation);
                    entities.SaveChanges();

                    MessageBox.Show("Для приминения изменений необходимо перезапустить ИС",
                                    "Оповещение", MessageBoxButton.OK, MessageBoxImage.Information);

                    Authorization showAuthorization = new Authorization();
                    showAuthorization.Show();
                    this.Close();
                }
                else
                    MessageBox.Show("Нет удаляемых объектов!", "Ошибка", MessageBoxButton.OK,
                                     MessageBoxImage.Warning);
            }
        }

        /* Очистка полей "Тип станции" */
        private void button_ClearTypeStation_Click(object sender, RoutedEventArgs e)
        {
            listBox_TypeStation.SelectedIndex = -1;
            textBox_TypeStation.Text = "";
            checkBox_passagerService.IsChecked = false;

            textBox_TypeStation.Focus();
        }


        /*******************/
        /* ОБЪЕКТ "ДОРОГА" */
        /*******************/
        
        /* Отображение данных в поля "Дороги" */
        private void listBox_Road_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var selectRoad = listBox_Road.SelectedItem as Roads;

            if (selectRoad != null)
            {
                textBox_NameRoad.Text = selectRoad.nameRoad;
                textBox_TypeRoad.Text = selectRoad.typeRoad;
                textBox_CategoryQuality.Text = selectRoad.categoryQuality;
            }

            else
            {
                textBox_TypeStation.Text = "";
                textBox_TypeRoad.Text = "";
                textBox_CategoryQuality.Text = "";
            }
        }

        /* Добавление/сохранение записи в "Дорогу" */
        private void button_AddRecord_Road_Click(object sender, RoutedEventArgs e)
        {
            var Road = listBox_Road.SelectedItem as Roads;

            if (textBox_NameRoad.Text == "" || 
                textBox_CategoryQuality.Text == "" ||
                textBox_TypeRoad.Text == "")
                MessageBox.Show("Заполните все поля!", "Ошибка!", MessageBoxButton.OK,
                                 MessageBoxImage.Error);
            else
            {
                if (Road == null)
                {
                    Road = new Roads();
                    entities.Roads.Add(Road);               // добавляем запись в БД
                    listBox_Road.Items.Add(Road);           // добавляем запись в ListBox
                }

                Road.nameRoad = textBox_NameRoad.Text;
                Road.categoryQuality = textBox_CategoryQuality.Text;
                Road.typeRoad = textBox_TypeRoad.Text;

                entities.SaveChanges();
                listBox_Road.Items.Refresh();

                MessageBox.Show("Успешное сохранение/добавление записи!", "Оповещение",
                                MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }

        /* Удаление записи в "Дороге" */
        private void button_DeleteRecord_Road_Click(object sender, RoutedEventArgs e)
        {
            var rezult = MessageBox.Show("Вы уверены, что хотите удалить запись?", "Удаление",
                                          MessageBoxButton.YesNo, MessageBoxImage.Question);

            if (rezult == MessageBoxResult.No)
                return;

            var delete_road = listBox_Road.SelectedItem as Roads;

            if (delete_road != null)
            {
                textBox_Station.Clear();
                textBox_TypeRoad.Clear();
                textBox_CategoryQuality.Clear();
                listBox_Road.Items.Remove(delete_road);

                entities.Roads.Remove(delete_road);
                entities.SaveChanges();
            }
            else
                MessageBox.Show("Нет удаляемых объектов!", "Ошибка", MessageBoxButton.OK,
                                 MessageBoxImage.Warning);
        }

        /* Очистка полей "Дороги" */
        private void button_ClearRoad_Click(object sender, RoutedEventArgs e)
        {
            textBox_NameRoad.Text = "";
            textBox_TypeRoad.Text = "";
            textBox_CategoryQuality.Text = "";
            listBox_Road.SelectedIndex = -1;

            textBox_NameRoad.Focus();
        }

        /* Кнопка поиска на вкладке "Станции" */
        private void buttonSearch_Stations_Click(object sender, RoutedEventArgs e)
        {
            if (textBox_Search_Stations.Text == "")
                return;
            else
                for (int i = listBox_Station.Items.Count - 1; i >= 0; i--)
                {
                    if (listBox_Station.Items[i].ToString().ToLower().Contains(textBox_Search_Stations.Text.ToLower()))
                        listBox_Station.SelectedIndex = i;
                }
        }

        /* Кнопка поиска на вкладке "Тип станции" */
        private void buttonSearch_TypeStation_Click(object sender, RoutedEventArgs e)
        {
            if (textBox_Search_TypeStations.Text == "")
                return;
            else
                for (int i = listBox_TypeStation.Items.Count - 1; i >= 0; i--)
                {
                    if (listBox_TypeStation.Items[i].ToString().ToLower().Contains(textBox_Search_TypeStations.Text.ToLower()))
                        listBox_TypeStation.SelectedIndex = i;
                }
        }

        /* Кнопка поиска на вкладке "Дорога" */
        private void buttonSearch_Road_Click(object sender, RoutedEventArgs e)
        {
            if (textBox_Search_Road.Text == "")
                return;
            else
                for (int i = listBox_Road.Items.Count - 1; i >= 0; i--)
                {
                    if (listBox_Road.Items[i].ToString().ToLower().Contains(textBox_Search_Road.Text.ToLower()))
                        listBox_Road.SelectedIndex = i;
                }
        }

        /* Закрытие окна и возврат к авторизации */
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Authorization showAuthorization = new Authorization();
            showAuthorization.Show();
            this.Close();
        }

        /* Открытие окна DataGrid */
        private void button_OpenDisplayData_Click(object sender, RoutedEventArgs e)
        {
            DataGrid_Station showDataGrid_Station = new DataGrid_Station();
            showDataGrid_Station.Show();
        }
    }
}
