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
{
    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;
            }

            // Отображение списка исполнителей в ListView
            LViewExecutors.ItemsSource = executerContext;
        }

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

            // Получение списка менеджеров для ComboBox
            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();

                                    // Обновляем список исполнителей в ListView
                                    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)
        {
            // Обновление списка исполнителей в ListView
            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 FilterExecutors()
        {
            // Получение актуальных данных исполнителей
            executerContext = Class.ExecuterFill.Fill();

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

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

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

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

            // Обновление списка исполнителей в ListView
            LViewExecutors.ItemsSource = executerContext;
        }

        // Обработчик изменения выбора менеджера в ComboBox
        private void cbManager_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            FilterExecutors();
        }

        // Обработчик изменения выбора исполнителя в ComboBox
        private void cbExecutor_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            FilterExecutors();
        }

        // Обработчик изменения текста в поле поиска
        private void Search_TextChanged(object sender, TextChangedEventArgs e)
        {
            FilterExecutors();
        }

        // Обработчик кнопки очистки фильтра
        private void btnClearFilter_Click(object sender, RoutedEventArgs e)
        {
            // Очистка выбранных значений ComboBox
            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(executor => !executor.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);
                        }
                    }
                }
            }
        }
    }
}
