using esoft.Class;
using esoft.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;

namespace esoft.Pages
{
    // Класс AddEditServicePage представляет страницу для добавления или редактирования задачи.
    public partial class AddEditServicePage : Page
    {
        // Создание экземпляра ActualContext для доступа к актуальным данным.
        ActualContext actualContext = new ActualContext();

        // Список задач, используемых в форме.
        List<TaskFill> taskContext = new List<TaskFill>();

        // Выбранная задача для редактирования.
        private TaskFill selectedTask;

        // Флаг редактирования задачи.
        private bool isEditing = false;

        // Конструктор класса принимает выбранную задачу для редактирования.
        public AddEditServicePage(TaskFill task)
        {
            InitializeComponent();
            selectedTask = task;

            // Устанавливаем флаг редактирования, если задача уже существует.
            if (selectedTask.Title != null)
            {
                isEditing = true;
            }

            // Заполняем форму данными.
            FillForm();

            // Загружаем правила пользователя.
            LoadUserRule();
        }

        // Метод FillForm заполняет форму данными о задаче.
        private void FillForm()
        {
            // Заполнение выпадающего списка статусов задач.
            cbStatus.ItemsSource = StatusTask.FillStatus();
            DPickerDateCreate.SelectedDate = DateTime.Today;

            // Если задача редактируется, заполняем форму данными.
            if (isEditing && selectedTask != null)
            {
                TBoxTitle.Text = selectedTask.Title;
                cbExecutor.SelectedItem = selectedTask.FioUser;
                cbManager.SelectedItem = selectedTask.FioManager;

                // Устанавливаем выбранный статус.
                if (cbStatus.ItemsSource is IEnumerable<StatusTask> statusList)
                {
                    cbStatus.SelectedItem = statusList.FirstOrDefault(status => status.Name == selectedTask.Status);
                }

                IUDComplexityTask.Value = (int)selectedTask.Difficulty;
                IUDTimeTask.Value = selectedTask.Time;
                cbNatureTask.Text = selectedTask.WorkType;
                TBoxDescription.Text = selectedTask.Description;
                DPickerDateCreate.SelectedDate = selectedTask.CreateDateTime;
                DPickerDateDeadLine.SelectedDate = selectedTask.Deadline;
                DPickerDateCompleted.SelectedDate = selectedTask.CompletedDateTime;
            }

            // Получаем список исполнителей и менеджеров для заполнения выпадающих списков.
            var usersExecutor = actualContext.Users.Where(user => actualContext.Executor.Any(ex => ex.ID == user.ID)).ToList();
            cbExecutor.ItemsSource = UserInFIO.GroupUser(usersExecutor);

            var usersManager = actualContext.Users.Where(user => actualContext.Manager.Any(manager => manager.ID == user.ID)).ToList();
            cbManager.ItemsSource = UserInFIO.GroupUser(usersManager);
        }

        // Метод LoadUserRule загружает правила пользователя в зависимости от его роли.
        private void LoadUserRule()
        {
            // Получаем текущего пользователя.
            var currentUser = GetCurrent.CurrentUser;

            // Проверяем, является ли пользователь менеджером.
            var isManager = actualContext.Manager.Any(manager => manager.ID == currentUser.ID);

            // Устанавливаем доступность элементов формы в зависимости от роли пользователя.
            if (isManager)
            {
                cbExecutor.IsEnabled = true;
                cbManager.IsEnabled = true;
            }
            else
            {
                cbExecutor.IsEnabled = false;
                cbManager.IsEnabled = false;
            }
        }

        // Обработчик события нажатия кнопки сохранения задачи.
        private void BtnSaveTask_Click(object sender, RoutedEventArgs e)
        {
            // Получаем значения полей из формы.
            string title = TBoxTitle.Text;
            string executorName = cbExecutor.SelectedItem?.ToString();
            string managerName = cbManager.SelectedItem?.ToString();
            string status = cbStatus.Text;
            int complexity = (int)IUDComplexityTask.Value;
            int time = (int)IUDTimeTask.Value;
            string nature = cbNatureTask.Text;
            string description = TBoxDescription.Text;
            DateTime createDate = DPickerDateCreate.SelectedDate ?? DateTime.Now;
            DateTime deadline = DPickerDateDeadLine.SelectedDate ?? DateTime.Now;

            // Проверка заполнения обязательных полей.
            if (string.IsNullOrWhiteSpace(title) || string.IsNullOrWhiteSpace(executorName) || string.IsNullOrWhiteSpace(managerName) || string.IsNullOrWhiteSpace(status))
            {
                MessageBox.Show("Пожалуйста, заполните все обязательные поля!", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            try
            {
                // Получаем контекст данных.
                var context = esoftEntities.GetContext();

                // Получаем идентификатор исполнителя и менеджера из контекста данных.
                var executorID = actualContext.Users.FirstOrDefault(u => UserInFIO.SoloUser(u) == executorName)?.ID;
                var managerID = actualContext.Users.FirstOrDefault(u => UserInFIO.SoloUser(u) == managerName)?.ID;

                // Проверяем, найдены ли исполнитель и менеджер.
                if (executorID == null || managerID == null)
                {
                    MessageBox.Show("Исполнитель или менеджер не найден!", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                // Если редактирование, обновляем существующую задачу.
                if (isEditing)
                {
                    var existingTask = context.Task.FirstOrDefault(t => t.ID == selectedTask.ID);

                    if (existingTask != null)
                    {
                        // Обновляем данные задачи.
                        existingTask.Title = title;
                        existingTask.ExecutorID = executorID.Value;
                        existingTask.Status = status;
                        existingTask.Difficulty = complexity;
                        existingTask.Time = time;
                        existingTask.WorkType = nature;
                        existingTask.Description = description;
                        existingTask.CreateDateTime = createDate;
                        existingTask.Deadline = deadline.Date;

                        // Устанавливаем дату выполнения, если статус "выполнена".
                        if (status == "выполнена")
                        {
                            existingTask.CompletedDateTime = DateTime.Today;
                        }
                        else
                        {
                            existingTask.CompletedDateTime = null;
                        }

                        // Сохраняем изменения.
                        context.SaveChanges();

                        // Выводим сообщение об успешном изменении задачи.
                        MessageBoxResult result = MessageBox.Show("Задача успешно изменена!", "Успех", MessageBoxButton.OK, MessageBoxImage.Information);

                        // Переходим на предыдущую страницу после подтверждения.
                        if (result == MessageBoxResult.OK)
                        {
                            NavigationService.GoBack();
                        }
                    }
                }
                else // Если создание новой задачи, добавляем ее в базу данных.
                {
                    esoft.Entities.Task newTask = new esoft.Entities.Task
                    {
                        Title = title,
                        ExecutorID = executorID.Value,
                        Status = status,
                        Difficulty = complexity,
                        Time = time,
                        WorkType = nature,
                        Description = description,
                        CreateDateTime = DateTime.Today,
                        Deadline = deadline.Date,
                    };

                    context.Task.Add(newTask);
                    context.SaveChanges();

                    // Выводим сообщение об успешном добавлении задачи.
                    MessageBoxResult result = MessageBox.Show("Задача успешно добавлена!", "Успех", MessageBoxButton.OK, MessageBoxImage.Information);

                    // Переходим на предыдущую страницу после подтверждения.
                    if (result == MessageBoxResult.OK)
                    {
                        NavigationService.GoBack();
                    }
                }
            }
            catch (Exception ex)
            {
                // Выводим сообщение об ошибке при обработке задачи.
                MessageBox.Show($"Ошибка при обработке задачи: {ex.Message}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
    }
}
