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;

namespace CatProject
{
    /// <summary>
    /// Логика взаимодействия для CatViewPage.xaml
    /// </summary>
    public partial class CatViewPage : Page
    {
        public CatViewPage()
        {
            InitializeComponent();
            CatList.ItemsSource = BaseClass.BaseConnect.CatTable.ToList();  // передаем записи из таблицы БД ListView
            List<BreedTable> breedList = BaseClass.BaseConnect.BreedTable.ToList();

            // программное заполнение выпадающего списка
            CBFilterBreed.Items.Add("Все породы");  // первый элемент выпадающего списка, который сбрасывает фильтрацию
            foreach (BreedTable breed in breedList)  // цикл для записи в выпадающий список всех пород котов из БД
            {
                CBFilterBreed.Items.Add(breed.Breed);  // выбранное по умолчанию значение в списке с породами котов ("Все породы")
            }
            CBFilterBreed.SelectedIndex = 0;

        }

        void Filter()  // метод для одновременной фильтрации, поиска и сортировки
        {
            List<CatTable> catFilter = new List<CatTable>();  // пустой список, который далее будет заполнять элементами, удавлетворяющими условиям фильтрации, поиска и сортировки

            string breed = CBFilterBreed.SelectedValue.ToString();  // выбранное пользователем название породы

            // поиск значений, удовлетворяющих условия фильтра
            if (CBFilterBreed.SelectedIndex!=0)
            {
                
                catFilter = BaseClass.BaseConnect.CatTable.Where(x => x.BreedTable.Breed == breed).ToList();
            }
            else
            {
                catFilter = BaseClass.BaseConnect.CatTable.ToList();  // если выбран пункт "Все породы", то сбрасываем фильтрацию:
            }

            // поиск совпадений по именам котов
            if (!string.IsNullOrWhiteSpace(TBSearch.Text))  // если строка не пустая и если она не состоит из пробелов
            {
                catFilter =catFilter.Where(x => x.CatName.ToLower().Contains(TBSearch.Text.ToLower())).ToList();
            }

            // выбор только котов-мальчиков
            if (CBOnly.IsChecked==true)
            {
                catFilter = catFilter.Where(x => x.idGender == 1).ToList();
            }

            // сортировка
            if (RBUp.IsChecked==true)  // позрастанию имени
            {
                catFilter.Sort((x,y)=>x.CatName.CompareTo(y.CatName));
            }
            if (RBDown.IsChecked==true) // по убыванию имени
            {
                catFilter.Sort((x, y) => x.CatName.CompareTo(y.CatName));
                catFilter.Reverse();
            }           
            CatList.ItemsSource = catFilter;
        }
        private void TextBlock_Loaded(object sender, RoutedEventArgs e)  // загрузка черт характера
        {
            TextBlock tb = (TextBlock)sender;  // получаем доступ к TextBlock из шаблона
            int index = Convert.ToInt32(tb.Uid);  // получаем числовой Uid элемента списка (в разметке предварительно нужно связать номер ячейки с номером кота в базе данных)
            // ищем в таблице, где хранятся черты характера котов те записи, которые соответсвуют определенному коту
            List<TraitCatTable> TCT = BaseClass.BaseConnect.TraitCatTable.Where(x => x.idCat == index).ToList();
            string str = "";
            // выписывам все черты характера в переменную
            foreach (TraitCatTable t in TCT)
            {
                str += t.TraitTable.Trait + ", ";
            }
            if (str!="") 
                tb.Text = str.Substring(0, str.Length - 2);
        }

        private void TextBlock_Loaded_1(object sender, RoutedEventArgs e)  // загрузка информации о том, сколько будет денег тратиться на кота
        {
            TextBlock tb = (TextBlock)sender;  // получаем доступ к TextBlock из шаблона
            int index = Convert.ToInt32(tb.Uid);  // получаем числовой Uid элемента списка (в разметке предварительно нужно связать номер ячейки с номером кота в базе данных)
            // ищем в таблице, где хранятится информация о кормах для кота, которые соответсвуют определенному коту
            List<feedCatTable> FCT = BaseClass.BaseConnect.feedCatTable.Where(x => x.idCat == index).ToList();
            int sum = 0;
            // вычисляем общее количестов денег на кота, для этого умножаем количество корма на цену корма
            foreach (feedCatTable t in FCT)
            {
                sum += t.Feedtable.Price * t.Count;
            }
            tb.Text = "Трата на кота: " + sum.ToString();
        }

        private void AddCat_Click(object sender, RoutedEventArgs e)
        {
            FrameClass.MainFrame.Navigate(new AddPage());
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Button tb = (Button)sender;  // получаем доступ к TextBlock из шаблона
            int index = Convert.ToInt32(tb.Uid);  // получаем числовой Uid элемента списка (в разметке предварительно нужно связать номер ячейки с номером кота в базе данных)
            FrameClass.MainFrame.Navigate(new AddPage(index));

        }

        private void Button_Click_1(object sender, RoutedEventArgs e) // удаление кота
        {
            Button tb = (Button)sender;  // получаем доступ к TextBlock из шаблона
            int index = Convert.ToInt32(tb.Uid);  // получаем числовой Uid элемента списка (в разметке предварительно нужно связать номер ячейки с номером кота в базе данных)
            CatTable catRemove = BaseClass.BaseConnect.CatTable.FirstOrDefault(x=>x.idCat == index);
            switch(MessageBox.Show("Удалить кота???", "RemoveCat", MessageBoxButton.YesNo, MessageBoxImage.Question))
            {
                case MessageBoxResult.Yes:
                    BaseClass.BaseConnect.CatTable.Remove(catRemove);
                    MessageBox.Show("Кот удален");
                    BaseClass.BaseConnect.SaveChanges();
                    FrameClass.MainFrame.Navigate(new CatViewPage());
                    break;
                    case MessageBoxResult.No:
                    MessageBox.Show("Кот не удален");
                    break;
            }

        }

        // далее во всех обработчиках событий применяем один и тот же метод Filter, который позволяет находить условия, удовлетворяющие всем сразу выбранным параметрам
        private void TBSearch_TextChanged(object sender, TextChangedEventArgs e)
        {
            Filter();
        }

        private void CBFilterBreed_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            Filter();
        }

        private void CBOnly_Checked(object sender, RoutedEventArgs e)
        {
            Filter();
        }

        private void CBOnly_Unchecked(object sender, RoutedEventArgs e)
        {
            Filter();
        }

        private void RBUp_Checked(object sender, RoutedEventArgs e)
        {
            Filter();
        }

        private void BtnAuto_Click(object sender, RoutedEventArgs e) // авторизация
        {
            WindowAuto windowAuto = new WindowAuto();
            windowAuto.ShowDialog();
        }
    }
}
