using esoft.Class;
using esoft.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
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 esoft.Pages
{
    /// <summary>
    /// Логика взаимодействия для ExecutorsListPage.xaml
    /// </summary>
    public partial class ExecutorsListPage : Page
    {
        ActualContext actualContext = new ActualContext();                 // Контекст таблиц
        ExecuterFill executer = new ExecuterFill();                       // Полученный контекст формы
        List<ExecuterFill> executerContext = new List<ExecuterFill>();   // Список исполнителей

        public ExecutorsListPage()
        {
            InitializeComponent();
            FillForm();
            LoadUserRule();
        }

        private void LoadUserRule()
        {
            executerContext = Class.ExecuterFill.Fill();

            var currentUser = GetCurrent.CurrentUser; // Получаем текущего пользователя
            var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);

            // Проверка роли пользователя
            if (isManager)
            {
                BtnAddExecutor.Visibility = Visibility.Visible;
                BtnDeleteExecutor.Visibility = Visibility.Visible;
                BtnUpdate.Visibility = Visibility.Visible;
            }
            else
            {
                BtnAddExecutor.Visibility = Visibility.Hidden;
                BtnDeleteExecutor.Visibility = Visibility.Hidden;
                BtnUpdate.Visibility = Visibility.Hidden;
            }

            LViewExecutors.ItemsSource = executerContext;
        }

        private void FillForm()
        {
            // Получение списка исполнителей
            List<User> usersExecutor = actualContext.Users.Where(user => actualContext.Executor.Any(ex => ex.ID == user.ID)).ToList();
            cbExecutor.ItemsSource = UserInFIO.GroupUser(usersExecutor);

            // Получение списка менеджеров
            List<User> usersManager = actualContext.Users.Where(user => actualContext.Manager.Any(manager => manager.ID == user.ID)).ToList();
            cbManager.ItemsSource = UserInFIO.GroupUser(usersManager);
        }

        private void BtnDeleteExecutor_Click(object sender, RoutedEventArgs e)
        {

            executerContext = Class.ExecuterFill.Fill();

            var currentUser = GetCurrent.CurrentUser; // Получаем текущего пользователя
            var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);


            if (LViewExecutors.SelectedItem is ExecuterFill selectedExecutor)
            {
                // Проверка роли пользователя
                if (isManager)
                {

                    if (selectedExecutor.ManagerID != currentUser.ID)
                    {
                        MessageBox.Show("Извините, но вы не можете удалить исполнителя, который за вами не закреплён!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    else
                    {
                        try
                        {
                            var context = esoftEntities.GetContext();
                            if (selectedExecutor != null)
                            {
                                var existingUser = context.User.FirstOrDefault(u => u.ID == selectedExecutor.ID);
                                if (existingUser != null)
                                {
                                    existingUser.IsDeleted = true;
                                    context.SaveChanges();
                                    executerContext = Class.ExecuterFill.Fill().Where(executer => !executer.IsDeleted).ToList();
                                    LViewExecutors.ItemsSource = executerContext;
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show($"Ошибка при удалении пользователя: {ex.Message}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("Выберите исполнителя для редактирования.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }

        private void BtnAddExecutor_Click(object sender, RoutedEventArgs e)
        {
            // Перенаправление пользователя на страницу с задачами
            NavigationService.Navigate(new Pages.AddExecutorPage(executer));
        }

        private void BtnUpdate_Click(object sender, RoutedEventArgs e)
        {
            LViewExecutors.ItemsSource = Class.ExecuterFill.Fill();
        }

        private void LViewExecutors_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            executerContext = Class.ExecuterFill.Fill();

            var currentUser = GetCurrent.CurrentUser; // Получаем текущего пользователя
            var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);


            if (LViewExecutors.SelectedItem is ExecuterFill selectedExecutor)
            {
                // Проверка роли пользователя
                if (isManager)
                {
                    if (selectedExecutor.ManagerID != currentUser.ID)
                    {
                        MessageBox.Show("Извините, но вы не можете редактировать информацию исполнителя, который за вами не закреплён!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    else
                    {
                        // Передаем выбранного Исполнителя в окно редактирования
                        AddExecutorPage editPage = new AddExecutorPage(selectedExecutor);

                        // Заполнение данных из выбранного исполнителя в форму редактирования
                        editPage.TBoxSurname.Text = selectedExecutor.MiddleName;
                        editPage.TBoxName.Text = selectedExecutor.FirstName;
                        editPage.TBoxLastName.Text = selectedExecutor.LastName;
                        editPage.TBoxLogin.Text = selectedExecutor.Login;
                        editPage.TBoxPassword.Text = selectedExecutor.Password;

                        // Поиск соответствующего элемента в ComboBox `cbGrade` и установка его в качестве выбранного
                        if (editPage.cbGrade.ItemsSource is IEnumerable<GetGrade> gradeList)
                        {
                            var selectedGrade = gradeList.FirstOrDefault(executor => executor.Name == selectedExecutor.Grade);
                            editPage.cbGrade.SelectedItem = selectedGrade;
                        }

                        // Открываем окно редактирования
                        NavigationService.Navigate(editPage);
                    }
                }
                else
                {
                    if (selectedExecutor.ID != currentUser.ID)
                    {
                        MessageBox.Show("Извините, но с вашими правами, вы не можете редактировать информацию других исполнителей!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    else
                    {
                        // Передаем выбранного Исполнителя в окно редактирования
                        AddExecutorPage editPage = new AddExecutorPage(selectedExecutor);

                        // Заполнение данных из выбранного исполнителя в форму редактирования
                        editPage.TBoxSurname.Text = selectedExecutor.MiddleName;
                        editPage.TBoxName.Text = selectedExecutor.FirstName;
                        editPage.TBoxLastName.Text = selectedExecutor.LastName;
                        editPage.TBoxLogin.Text = selectedExecutor.Login;
                        editPage.TBoxPassword.Text = selectedExecutor.Password;

                        // Поиск соответствующего элемента в ComboBox `cbGrade` и установка его в качестве выбранного
                        if (editPage.cbGrade.ItemsSource is IEnumerable<GetGrade> gradeList)
                        {
                            var selectedGrade = gradeList.FirstOrDefault(executor => executor.Name == selectedExecutor.Grade);
                            editPage.cbGrade.SelectedItem = selectedGrade;
                        }

                        // Открываем окно редактирования
                        NavigationService.Navigate(editPage);
                    }
                }
            }
            else
            {
                MessageBox.Show("Выберите исполнителя для редактирования.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }

        private void FilterTasks()
        {
            // Получение актуальных данных задач из базы или контекста приложения
            executerContext = Class.ExecuterFill.Fill();

            if (cbExecutor.SelectedItem != null)
            {
                string selectedExecutor = cbExecutor.SelectedItem.ToString();
                executerContext = executerContext.Where(task => task.FioUser == selectedExecutor).ToList();
            }

            if (cbManager.SelectedItem != null)
            {
                string selectedManager = cbManager.SelectedItem.ToString();
                executerContext = executerContext.Where(task => task.FioManager == selectedManager).ToList();
            }

            if (!string.IsNullOrEmpty(Search.Text))
            {
                // Преобразование текста поиска к нижнему регистру (для удобства сравнения)
                string searchText = Search.Text.ToLower();

                // Фильтрация задач по содержанию текста в полях Title
                executerContext = executerContext.Where(task => task.FioUser.ToLower().Contains(searchText)).ToList();
            }

            LViewExecutors.ItemsSource = executerContext;
        }

        private void cbManager_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            FilterTasks();
        }

        private void cbExecutor_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            FilterTasks();
        }

        private void Search_TextChanged(object sender, TextChangedEventArgs e)
        {
            FilterTasks();
        }

        private void btnClearFilter_Click(object sender, RoutedEventArgs e)
        {
            // Очистка выбранных значений комбо боксов
            cbExecutor.SelectedItem = null;
            cbManager.SelectedItem = null;
            Search.Text = string.Empty;

            // Очистка фильтров и отображение всех задач без фильтрации
            LViewExecutors.ItemsSource = Class.ExecuterFill.Fill();
        }

        private void LViewExecutors_Loaded(object sender, RoutedEventArgs e)
        {
            // Получение исполнителей, не помеченных на удаление
            executerContext = Class.ExecuterFill.Fill().Where(executer => !executer.IsDeleted).ToList();
            LViewExecutors.ItemsSource = executerContext;
        }

        private void BtnPriceCoefficient_Click(object sender, RoutedEventArgs e)
        {

            executerContext = Class.ExecuterFill.Fill();

            var currentUser = GetCurrent.CurrentUser; // Получаем текущего пользователя
            var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);


            if (LViewExecutors.SelectedItem is ExecuterFill selectedExecutor)
            {
                // Проверка роли пользователя
                if (isManager)
                {
                    if (selectedExecutor.ManagerID != currentUser.ID)
                    {
                        MessageBox.Show("Извините, но вы не можете просматривать информацию о зарплате исполнителя, который за вами не закреплён!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    else
                    {
                        if (LViewExecutors.SelectedItem is ExecuterFill selectedExecuter)
                        {
                            // Передаем выбранного исполнителя на страницу редактирования коэффициентов
                            EditPriceCoefficient editPricePage = new EditPriceCoefficient(selectedExecuter);

                            // Открываем страницу редактирования коэффициентов
                            NavigationService.Navigate(editPricePage);
                        }
                        else
                        {
                            MessageBox.Show("Выберите исполнителя для редактирования коэффициентов.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                        }
                    }
                }
                else
                {
                    if (selectedExecutor.ID != currentUser.ID)
                    {
                        MessageBox.Show("Извините, но с вашими правами, вы не можете просматривать информацию о зарплате других исполнителей!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    else
                    {
                        if (LViewExecutors.SelectedItem is ExecuterFill selectedExecuter)
                        {
                            // Передаем выбранного исполнителя на страницу редактирования коэффициентов
                            EditPriceCoefficient editPricePage = new EditPriceCoefficient(selectedExecuter);

                            // Открываем страницу редактирования коэффициентов
                            NavigationService.Navigate(editPricePage);
                        }
                        else
                        {
                            MessageBox.Show("Выберите исполнителя для редактирования коэффициентов.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                        }
                    }
                }
            }
        }
    }
}
