using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media.Imaging;

namespace Hotel_Course_Project
{
    /// <summary>
    /// Логика взаимодействия для StaffChangeOrAddPage.xaml
    /// </summary>
    public partial class StaffChangeOrAddPage : Page
    {
        public byte[] contractImage;
        public string FilePath;
        public Staff _staff;
        public Staff addStaff;
        public int IdStaff = 0;
        public StaffChangeOrAddPage(Staff staff)
        {
            InitializeComponent();
            DataContext = staff;
            _staff = staff;
            SStaffRole.ItemsSource = DataBase.db.StaffRole.ToList();
            if (DataContext != null)
            {
                SStaffRole.Text = staff.ToString();
                StaffChangeOrAddBtn.Content = "Изменить данные";
                SLogin.IsReadOnly = true;
                this.Title = "Информация о сотруднике";
                IdStaff = staff.Id;
                StaffDeleteOrRestoreBtn.Visibility = Visibility.Visible;
                if (staff.Id_PersStatus == 1)
                {
                    StaffDeleteOrRestoreBtn.Content = "Удалить сотрудника";
                }
                else
                {
                    StaffDeleteOrRestoreBtn.Content = "Востановить сотрудника";
                }
            }
            else
            {
                SLogin.IsReadOnly = false;
                StaffChangeOrAddBtn.Content = "Добавить сотрудника";
                this.Title = "Окно добавления сотрудника";
                StaffDeleteOrRestoreBtn.Visibility = Visibility.Collapsed;
            }


        }

        private void StaffChangeOrAddBtn_Click(object sender, RoutedEventArgs e)
        {
            if (DataContext == null)
            {
                if (SStaffRole.Text == null || SStaffRole.Text == "")
                {
                    MessageBox.Show("Не выбрана должность");
                    return;
                }
                else
                {
                    int numRole = DataBase.db.StaffRole.SingleOrDefault(item => item.Name == SStaffRole.Text).Id;
                    if (TestAddStaff(SLName.Text, SFName.Text, SMName.Text, SLogin.Text, numRole) == true)
                    {
                        DataBase.db.Staff.Add(addStaff);
                        var lastId = DataBase.db.Staff.OrderByDescending(item => item.Id).FirstOrDefault().Id;
                        DataBase.db.Staff.SingleOrDefault(item => item.Id == lastId).PhotoContract = contractImage;
                        DataBase.db.SaveChanges();
                        MessageBox.Show("Сотрудник добавлен в базу.");
                        PChanger.MainFrame.GoBack();
                    }
                    else
                    {
                        if (SLName.Text == null || SLName.Text == "" || SFName.Text == null || SFName.Text == "" || SMName.Text == null || SMName.Text == "" || SLogin.Text == null || SLogin.Text == "")
                        {
                            MessageBox.Show("Ключевые поля не были заполнены!");
                        }
                        else
                        {
                            MessageBox.Show("Такой логин уже имеется в базе данных у другого сотрудника!");
                        }
                    }
                }
            }
            else
            {

                if (SLName.Text == null || SFName.Text == null || SLogin.Text == null)
                {
                    MessageBox.Show("Ключевые поля не были заполнены!");
                    return;
                }
                else if (DataBase.db.Staff.SingleOrDefault(item => item.Id == IdStaff).Login != SLogin.Text)
                {
                    if (DataBase.db.Staff.SingleOrDefault(item => item.Login == SLogin.Text) != null)
                    {
                        MessageBox.Show("Такой логин имеется у другого сотрудника");
                        return;
                    }
                }
                MessageBox.Show("Данные по сотрудинку изменены.");
                _staff.PhotoContract = contractImage;
                DataBase.db.SaveChanges();
                PChanger.MainFrame.GoBack();
                return;
            }
        }

        public bool TestAddStaff(string LName, string FName, string MName, string Login, int numRole)
        {
            if (LName == null || LName == "" || FName == null || FName == "" || Login == null || Login == "")
            {
                return false;
            }
            else
            {
                var existUserS = DataBase.db.Staff.SingleOrDefault(item => item.Login == Login);
                if (existUserS != null)
                {
                    return false;
                }
                else
                {
                    Staff staff = new Staff()
                    {
                        LName = LName,
                        FName = FName,
                        MName = MName,
                        Login = Login,
                        Password = SomeMethods.Hash("12345678"),
                        Id_StaffRole = numRole,
                        Id_PersStatus = 1
                    };
                    addStaff = staff;
                    return true;
                }
            }
        }

        private void StaffDeleteOrRestoreBtn_Click(object sender, RoutedEventArgs e)
        {
            if (_staff.Id_PersStatus == 1)
            {
                _staff.Id_PersStatus = 2;
                MessageBox.Show("Статус пользователя изменился на <удалён>");
            }
            else
            {
                _staff.Id_PersStatus = 1;
                MessageBox.Show("Статус пользователя восстановлен");
            }
            DataBase.db.SaveChanges();
            PChanger.MainFrame.GoBack();
        }

        private void SContractPhoto_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            if (openFileDialog.ShowDialog() == true)
            {
                FilePath = openFileDialog.FileName;
                string uriString = $"{FilePath}";
                BitmapImage bitimage = new BitmapImage(new Uri(@uriString));
                if (TestReceiveImage(uriString) == true)
                {
                    SContractPhoto.Source = bitimage;
                    contractImage = SomeMethods.ConvertBitmapImageToByte(bitimage);
                }
                else
                {
                    MessageBox.Show("Ошибка при выборе изображения!\nБыло выбрано не изображение");
                }
            }
            else
            {
                FilePath = string.Empty;
            }
        }
        public bool TestReceiveImage(string uriString)
        {

            List<string> png = "89 50 4E 47".Split().ToList();
            List<string> jpg = "FF D8 FF DB".Split().ToList();
            List<string> jpeg = "FF D8 FF E0".Split().ToList();

            List<string> fileHead = new List<string>();
            try
            {
                using (FileStream stream = File.OpenRead(uriString))
                {
                    for (int i = 0; i < 4; i++)
                    {
                        string bit = stream.ReadByte().ToString("X2");
                        fileHead.Add(bit);
                    }
                }
            }
            catch
            {
                return false;
            }
            if (!png.Except(fileHead).Any())
            {
                return true;
            }
            if (!jpg.Except(fileHead).Any())
            {
                return true;
            }
            if (!jpeg.Except(fileHead).Any())
            {
                return true;
            }
            return false;
        }

        private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            if (_staff == null || _staff.PhotoContract == null)
            {
                SContractPhoto.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/no_picture.jpg"));
            }
        }
    }
}
