// Импорт необходимых пространств имен
using esoft.Class;
using esoft.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
// ...

namespace esoft.Pages
{
    public partial class TaskLists : Page
    {
        // Создание экземпляров классов
        ActualContext actualContext = new ActualContext();
        TaskFill tasks = new TaskFill();
        List<TaskFill> taskContext = new List<TaskFill>();

        // Конструктор страницы
        public TaskLists()
        {
            InitializeComponent();

            // Инициализация элемента управления LViewTask данными из TaskFill
            LViewTask.ItemsSource = Class.TaskFill.TaskFills();
            FillForm();
            LoadAndSortTasks();
            LoadUserRule();
        }

        // Загрузка и сортировка задач
        private void LoadAndSortTasks()
        {
            // Сортировка задач по убыванию даты создания
            taskContext = Class.TaskFill.TaskFills();
            taskContext = taskContext.OrderByDescending(task => task.CreateDateTime).ToList();
            LViewTask.ItemsSource = taskContext;
        }

        // Загрузка и применение прав доступа пользователя
        private void LoadUserRule()
        {
            // Получение данных о задачах
            taskContext = Class.TaskFill.TaskFills();

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

            if (isManager)
            {
                // Логика сортировки для менеджеров
                var subordinateExecutors = actualContext.Executor.Where(executor => executor.ManagerID == currentUser.ID).Select(executor => executor.ID).ToList();

                taskContext = taskContext
                    .Where(task => subordinateExecutors.Contains(task.ExecutorID))
                    .OrderByDescending(task => task.CreateDateTime)
                    .ToList();

                // Отображение элементов управления для менеджеров
                cbExecutor.Visibility = Visibility.Visible;
                cbManager.Visibility = Visibility.Visible;
                btnClearFilter.Visibility = Visibility.Visible;
                Search.Visibility = Visibility.Visible;
                BtnDeleteTask.Visibility = Visibility.Visible;
                BtnAddTask.Visibility = Visibility.Visible;
                BtnUpdate.Visibility = Visibility.Visible;
            }
            else
            {
                // Логика сортировки для исполнителей
                taskContext = taskContext
                    .Where(task => task.ExecutorID == currentUser.ID)
                    .OrderByDescending(task => task.CreateDateTime)
                    .ToList();

                // Скрытие элементов управления для исполнителей
                cbExecutor.Visibility = Visibility.Hidden;
                cbManager.Visibility = Visibility.Hidden;
                btnClearFilter.Visibility = Visibility.Hidden;
                Search.Visibility = Visibility.Hidden;
                BtnDeleteTask.Visibility = Visibility.Hidden;
                BtnAddTask.Visibility = Visibility.Hidden;
                BtnUpdate.Visibility = Visibility.Hidden;
            }

            // Применение отфильтрованных данных к элементу управления
            LViewTask.ItemsSource = taskContext;
        }

        // Заполнение формы данными
        private void FillForm()
        {
            // Заполнение комбобоксов данными из базы данных
            cbStatus.ItemsSource = StatusTask.FillStatus();

            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 BtnAddTask_Click(object sender, RoutedEventArgs e)
        {
            TaskFill newTask = new TaskFill();
            AddEditServicePage editPage = new AddEditServicePage(newTask);
            NavigationService.Navigate(editPage);
        }

        // Обработчик события нажатия на кнопку "Удалить задачу"
        private void BtnDeleteTask_Click(object sender, RoutedEventArgs e)
        {
            // Получение данных о задачах
            taskContext = Class.TaskFill.TaskFills();

            var currentUser = GetCurrent.CurrentUser;
            var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);

            if (LViewTask.SelectedItem is TaskFill selectedTask)
            {
                // Проверка роли пользователя и соответствия менеджера выбранной задаче
                if (isManager)
                {
                    var ShortName = UserInFIO.SoloUser(currentUser);
                    if (selectedTask.FioManager != ShortName)
                    {
                        MessageBox.Show("Извините, но вы не можете удалить задачу, к которой вы не прикреплены в качестве менеджера!", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    else
                    {
                        try
                        {
                            // Вывод сообщения подтверждения удаления
                            MessageBoxResult result = MessageBox.Show("Вы уверены, что хотите удалить выбранную задачу?",
                                                                          "Подтверждение удаления",
                                                                          MessageBoxButton.YesNo,
                                                                          MessageBoxImage.Question);
                            if (result == MessageBoxResult.Yes)
                            {
                                var context = esoftEntities.GetContext();
                                var taskToDelete = context.Task.FirstOrDefault(task => task.ID == selectedTask.ID);

                                if (taskToDelete != null)
                                {
                                    // Установка флага IsDeleted для удаления задачи
                                    taskToDelete.IsDeleted = true;
                                    context.SaveChanges();
                                    LViewTask.ItemsSource = Class.TaskFill.TaskFills();

                                    // Обновление списка задач без удаленных задач
                                    taskContext = Class.TaskFill.TaskFills().Where(task => !task.IsDeleted).ToList();
                                    LViewTask.ItemsSource = taskContext;
                                    LoadAndSortTasks();
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show($"Ошибка при удалении задачи: {ex.Message}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("Выберите задачу для удаления.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }

        // Обработчик события нажатия на кнопку "Обновить"
        private void BtnUpdate_Click(object sender, RoutedEventArgs e)
        {
            LViewTask.ItemsSource = Class.TaskFill.TaskFills();
            LoadAndSortTasks();
            LoadUserRule();
        }

        // Фильтрация задач в соответствии с выбранными значениями комбобоксов и текстового поля
        private void FilterTasks()
        {
            // Получение актуальных данных задач из базы или контекста приложения
            taskContext = Class.TaskFill.TaskFills();

            if (cbStatus.SelectedItem != null)
            {
                var currentUser = GetCurrent.CurrentUser;
                var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);
                string selectedStatus = ((StatusTask)cbStatus.SelectedItem).Name;

                if (isManager)
                {
                    // Получаем ID подчиненных исполнителей для данного менеджера
                    var subordinateExecutors = actualContext.Executor.Where(executor => executor.ManagerID == currentUser.ID).Select(executor => executor.ID).ToList();

                    // Фильтрация задач подчиненных исполнителей менеджера по статусу
                    taskContext = taskContext.Where(task => subordinateExecutors.Contains(task.ExecutorID) && task.Status == selectedStatus).ToList();
                }
                else // Если текущий пользователь - исполнитель
                {
                    // Фильтрация задач текущего исполнителя по статусу
                    taskContext = taskContext.Where(task => task.ExecutorID == currentUser.ID && task.Status == selectedStatus).ToList();
                }
            }

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

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

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

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

            // Применение отфильтрованных данных к элементу управления
            LViewTask.ItemsSource = taskContext;
        }

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

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

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

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

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

            // Очистка фильтров и отображение всех задач без фильтрации
            LViewTask.ItemsSource = Class.TaskFill.TaskFills();
            LoadAndSortTasks();
            LoadUserRule();
        }

        // Обработчик события нажатия на кнопку "Список исполнителей"
        private void BtnExecutorList_Click(object sender, RoutedEventArgs e)
        {
            // Перенаправление пользователя на страницу с задачами
            NavigationService.Navigate(new Pages.ExecutorsListPage());
        }

        // Обработчик события загрузки элемента управления списком задач
        private void LViewTask_Loaded(object sender, RoutedEventArgs e)
        {
            // Загрузка данных о задачах, исключая удаленные задачи
            taskContext = Class.TaskFill.TaskFills().Where(task => !task.IsDeleted).ToList();
            LViewTask.ItemsSource = taskContext;
            FillForm();
            LoadAndSortTasks();
            LoadUserRule();
        }

        //Обработчик события двойного щелчка мыши по элементу в списке задач
        private void LViewTask_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            if (LViewTask.SelectedItem is TaskFill selectedTask)
            {
                // Проверка, не является ли статус задачи "выполнена" или "отменена"
                if (selectedTask.Status != "выполнена" && selectedTask.Status != "отменена")
                {
                    AddEditServicePage editPage = new AddEditServicePage(selectedTask); // Передача выбранной задачи в окно редактирования
                    NavigationService.Navigate(editPage); // Открытие окна редактирования
                }
                else
                {
                    MessageBox.Show("Нельзя редактировать задачи со статусом '" + selectedTask.Status + "'", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
                }
            }
            else
            {
                MessageBox.Show("Выберите задачу для редактирования.", "Внимание", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }
    }
}
