using Microsoft.Win32;
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
{
    enum StateOfPage { Create, Update };
    /// <summary>
    /// Логика взаимодействия для AddPage.xaml
    /// </summary>

    public partial class AddPage : Page
    {

        string path;  // переменная для хранения пути к фото кота
        StateOfPage stateOfPage;  // перечисление для создания флага о том, создаем нового кота или редактируем старого
        CatTable cat = new CatTable();  // создаем объект для кота

        void addList()  // метод для заполнения списков
        {
            // список с породами
            CBBreed.ItemsSource = BaseClass.BaseConnect.BreedTable.ToList();
            CBBreed.DisplayMemberPath = "Breed";
            CBBreed.SelectedValuePath = "idBreed";

            // список с чертами характера
            LBTrait.ItemsSource = BaseClass.BaseConnect.TraitTable.ToList();
            LBTrait.DisplayMemberPath = "Trait";
            LBTrait.SelectedValuePath = "idTrait";

            // список с кормами для кота
            LBFeed.ItemsSource = BaseClass.BaseConnect.Feedtable.ToList();
        }

        // конструктор для создания нового кота (без аргументов)
        public AddPage()
        {
            InitializeComponent();
            addList();
            stateOfPage = StateOfPage.Create;

        }
        // конструктор для редактирования данных о коте ( с аргументом, который хранит id кота, которого хотим отредактировать)
        public AddPage(int index)
        {
            InitializeComponent();
            BtnAdd.Content = "Внести изменения"; // изменили текст в кнопке
            addList();  // заполняем списки
            stateOfPage = StateOfPage.Update;  // флаг, что редактирум кота (созданный через перечисление)
            cat = BaseClass.BaseConnect.CatTable.FirstOrDefault(x => x.idCat == index); // ищем в базе кота по id
            TBName.Text = cat.CatName;  // вывод имени кота
            BreedTable breed = BaseClass.BaseConnect.BreedTable.FirstOrDefault(x => x.idBreed == cat.idBreed);  // поиск породы кота
            CBBreed.SelectedItem = breed;  // вывод породы кота
            DPBirthday.SelectedDate = cat.Birthday;  // вывод даты рождения 
            switch (cat.idGender)  // вывод пола кота
            {
                case 1:
                    RBMen.IsChecked = true;
                    break;
                case 2:
                    RBWomen.IsChecked = true;
                    break;
            }

            TBPassport.Text = cat.PasssportTable.UniqueNumber.ToString();  // вывод паспорта
            TBColor.Text = cat.PasssportTable.Color;  // вывод окраса

            // находим черты характера того кота, которого мы редактируем:
            List<TraitCatTable> TC = BaseClass.BaseConnect.TraitCatTable.Where(x => x.idCat == cat.idCat).ToList();
            // цикл для выделения черт характера кота в общем списке:
            foreach (TraitTable t in LBTrait.Items)
            {
                if (TC.FirstOrDefault(x => x.idTrait == t.idTrait) != null)
                {
                    LBTrait.SelectedItems.Add(t);
                }
            }

            // находим корма для того кота, которого мы редактируем
            List<feedCatTable> FC = BaseClass.BaseConnect.feedCatTable.Where(x => x.idCat == cat.idCat).ToList();
            // цикл для отображения кормов и их количества для кота:
            foreach (Feedtable t in LBFeed.Items)
            {
                feedCatTable f = FC.FirstOrDefault(x => x.idFeed == t.idFeed);
                if (f != null)
                {
                    t.NumFeed = f.Count;
                }
            }
        }

        private void BtnAdd_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                int gender = 0;
                if (RBMen.IsChecked == true)
                {
                    gender = 1;
                }
                if (RBWomen.IsChecked == true)
                {
                    gender = 2;
                }
                // заполняем поля таблицы CatTable

                cat.CatName = TBName.Text;
                cat.idBreed = ((BreedTable)CBBreed.SelectedItem).idBreed;
                cat.Birthday = DPBirthday.DisplayDate.Date;
                cat.idGender = gender;
                cat.Photo = path;
                if (stateOfPage == StateOfPage.Create) // если значение перечисления означает "Добавить кота", то добавляем объект в базу
                {
                    BaseClass.BaseConnect.CatTable.Add(cat);
                }

                // проверяем, есть ли в базе данные о паспорте кота, если есть то удаляем эти данные
                PasssportTable PT = BaseClass.BaseConnect.PasssportTable.FirstOrDefault(x => x.idCat == cat.idCat);
                if (PT != null)
                {
                    BaseClass.BaseConnect.PasssportTable.Remove(PT);
                }
                // формируем новый объект с данными паспорта кота
                PasssportTable pas = new PasssportTable()
                {
                    idCat = cat.idCat,
                    UniqueNumber = TBPassport.Text,
                    Color = TBColor.Text

                };
                BaseClass.BaseConnect.PasssportTable.Add(pas); // добавляем объект в базу

                // Для заполнения таблицы TraitCatTable нужно организовать цикл, так как черт характера у кота может быть несколько
                // Цикл будет организовывать по чертам характера, которые выделены в списке

                // находим в базе список черт характера кота:
                List<TraitCatTable> listTraitCat = BaseClass.BaseConnect.TraitCatTable.Where(x => x.idCat == cat.idCat).ToList();
                // если список не пустой, удаляем из него все черты характера  этого кота
                if (listTraitCat.Count > 0)
                {
                    foreach (TraitCatTable t in listTraitCat)
                    {
                        BaseClass.BaseConnect.TraitCatTable.Remove(t);
                    }
                }

                // перезаписываем черты кота (или добавляем черты для нового кота)
                foreach (TraitTable t in LBTrait.SelectedItems)
                {
                    TraitCatTable TCT = new TraitCatTable()
                    {
                        idCat = cat.idCat,
                        idTrait = t.idTrait,
                    };
                    BaseClass.BaseConnect.TraitCatTable.Add(TCT);
                }

                // Для заполнения таблицы feedCatTable нужно организовать цикл, так как кормов у кота может быть несколько
                // Цикл будет организовывать по всем кормам, которые есть в списке

                // находим список с кормами для кота
                List<feedCatTable> listFeedCat = BaseClass.BaseConnect.feedCatTable.Where(x => x.idCat == cat.idCat).ToList();
                // если список не пустой, удаляем из него все корма для  этого кота
                if (listFeedCat.Count > 0)
                {
                    foreach (feedCatTable t in listFeedCat)
                    {
                        BaseClass.BaseConnect.feedCatTable.Remove(t);
                    }
                }

                // перезаписываем корма для кота (или добавляем корма для нового кота)
                foreach (Feedtable f in LBFeed.Items)
                {
                    if (f.NumFeed > 0)
                    {
                        feedCatTable FCT = new feedCatTable()
                        {
                            idCat = cat.idCat,
                            idFeed = f.idFeed,
                            Count = f.NumFeed
                        };
                        BaseClass.BaseConnect.feedCatTable.Add(FCT);
                    }

                }
                BaseClass.BaseConnect.SaveChanges(); // сохраняем все внесенные изменения в базе данных

                if (stateOfPage == StateOfPage.Create)
                {
                    MessageBox.Show("Кот добавлен");
                }
                else
                {
                    MessageBox.Show("Изменения о коте внесены");
                }
                FrameClass.MainFrame.Navigate(new CatViewPage());
            }
            catch
            {
                MessageBox.Show("Что-то пошло не так");
                System.Windows.Application.Current.Shutdown();
            }
        }           

        private void AddPhotoCat_Click(object sender, RoutedEventArgs e) // добавление фото кота с помощью диалогового окна
        {
            try
            {
                OpenFileDialog OFD = new OpenFileDialog();  // создаем объект диалогового окна
                OFD.ShowDialog(); // открываем диалоговое окно
                path = OFD.FileName; // извлекаем полный путь к картинке
                int n = path.IndexOf("images");
                path = "\\" + path.Substring(n); // записываем в бд путь, начиная с имени папки
            }
            catch
            {
                MessageBox.Show("Фото не добавлено");
            }

        }
    }
}
