using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
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>
    /// Логика взаимодействия для PersonalPage.xaml
    /// </summary>
    public partial class PersonalPage : Page
    {
        /// <summary>
        /// Метод для отображения изображения
        /// </summary>
        /// <param name="array">байтовый массив</param>
        /// <param name="img">имя изображения в разметке</param>
        void showImage(byte[] array, System.Windows.Controls.Image img)
        {
            BitmapImage BI = new BitmapImage(); // создаем объект для загрузки картинки
            BI.BeginInit();  // начинаем считывание
            BI.StreamSource = new MemoryStream(array);  // задаем источник потока
            BI.EndInit();  // заканчиваем считывание
            img.Source = BI;  // показываем изображение на экране
            img.Stretch = Stretch.Uniform;
        }
        
        User user = new User();
        public PersonalPage(int id)
        {
            InitializeComponent();
            user = BaseClass.BaseConnect.User.FirstOrDefault(x=>x.id== id);
            tbSurname.Text = user.Surname;
            tbName.Text = user.Name;
            UserPhoto up = BaseClass.BaseConnect.UserPhoto.FirstOrDefault(x => x.id == user.Avatar); // ищем, какая картинка отображается у пользователя в качестве аватара
            if (up!= null )
            {
                byte[] Bar = up.Photo;
                showImage(Bar, imUser);               
            }
        }        
        private void BtnUpdate_Click(object sender, RoutedEventArgs e) // переход на окно для изменения личных данных
        {
            WindowNameSurname wns = new WindowNameSurname(user.id);  // создаем объект окна
            wns.ShowDialog(); // открываем окно
            FrameClass.MainFrame.Navigate(new PersonalPage(user.id));

        }

        private void BtnAddPhoto_Click(object sender, RoutedEventArgs e)  // для добавления нового фото и изменения аватара
        {
            try 
            { 
                // "длинный" способ для перевода изображения в байтовый массив, более которки способ представлен ниже в следующем обработчике событий
                UserPhoto photo = new UserPhoto(); // объект для записи в таблицу с фото
                photo.idUser = user.id; // присваиваем значение полю с id пользователя
                OpenFileDialog OFD = new OpenFileDialog(); // создаем диалоговое окно
                OFD.ShowDialog(); // открываем диалоговое окно
                string path = OFD.FileName; // считываем путь до выбранного изображения
                System.Drawing.Image SDI = System.Drawing.Image.FromFile(path); // создаем объект для загрузки в базу
                ImageConverter IC = new ImageConverter(); // создаем конвертер для перевода картинки в двоичный формат
                byte[] Barray = (byte[])IC.ConvertTo(SDI, typeof(byte[])); // создаем байтовый массив для хранения картинки
                photo.Photo = Barray; // заполняем поле в бд
                BaseClass.BaseConnect.UserPhoto.Add(photo);
                BaseClass.BaseConnect.SaveChanges();
                user.Avatar = photo.id; // изменяем номер аватара, который будет отображен в личном кабинете
                BaseClass.BaseConnect.SaveChanges();
                MessageBox.Show("Изображение добавлено");
                FrameClass.MainFrame.Navigate(new PersonalPage(user.id));
            }
            catch 
            {
                MessageBox.Show("Не удалось загрузить фото");
            }
}

        private void BtnManyPhoto_Click(object sender, RoutedEventArgs e) // для добавления в базу сразу нескольких фото
        {
            OpenFileDialog OFD = new OpenFileDialog();
            OFD.Multiselect = true; //  открываем диалоговое окно с возможностью выбора нескольких элементов
            if (OFD.ShowDialog()==true)
            {
                foreach (string file in OFD.FileNames) // цикл для записи нескольких фото в базу
                {
                    UserPhoto up = new UserPhoto();
                    up.idUser = user.id;
                    up.Photo = File.ReadAllBytes(file); // сразу переводим изображение в байтовый массив
                    BaseClass.BaseConnect.UserPhoto.Add(up);
                }
            }
            BaseClass.BaseConnect.SaveChanges();
        }

        List<UserPhoto> _photos = new List<UserPhoto>(); // список для хранения всех фото пользователя
        int n = 0; // счетчик для отображения картинок

        private void Button_Click(object sender, RoutedEventArgs e) // выбор фото из галереи
        {
            spGallery.Visibility = Visibility.Visible;
            _photos = BaseClass.BaseConnect.UserPhoto.Where(x=>x.idUser==user.id).ToList();
            if (_photos != null)
            {
                byte[] Bar = _photos[n].Photo;
                showImage(Bar, imgGallery);              
            }
            if (_photos.Count==1)
            {
                Next.IsEnabled = false;
            }

        }

        private void Next_Click(object sender, RoutedEventArgs e)
        {
            Back.IsEnabled = true;
            n++;
            byte[] Bar = _photos[n].Photo;
            showImage(Bar, imgGallery);          
            if (_photos.Count == n+1)
            {
                Next.IsEnabled = false;
            }
        }

        private void Back_Click(object sender, RoutedEventArgs e)
        {
            Next.IsEnabled=true;
            n--;
            byte[] Bar = _photos[n].Photo;
            showImage(Bar, imgGallery);
            if (n == 0)
            {
                Back.IsEnabled = false;
            }
        }
        private void btnOld_Click(object sender, RoutedEventArgs e)
        {
            byte[] Bar = _photos[n].Photo;
            showImage(Bar, imUser);
            user.Avatar = _photos[n].id;
            BaseClass.BaseConnect.SaveChanges();
            spGallery.Visibility = Visibility.Collapsed;
        }
    }
}
