using esoft.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

namespace esoft.Class
{
    public class TaskFill : esoft.Entities.Task
    {
        string fioManager;
        string fioUser;

        public string FioManager
        {
            get { return fioManager; }
            private set { fioManager = value; }
        }

        public string FioUser
        {
            get { return fioUser; }
            private set { fioUser = value; }
        }

        // Метод TaskFills заполняет список TaskFill данными о задачах для указанного пользователя.
        public static List<TaskFill> TaskFills(User user)
        {
            try
            {
                // Создание экземпляра ActualContext для получения актуальных данных
                ActualContext actualContext = new ActualContext();

                // Получение списка задач из контекста данных
                List<Task> tasks = esoftEntities.GetContext().Task.ToList();
                List<TaskFill> taskFills = new List<TaskFill>();

                // Проход по каждой задаче
                for (int i = 0; i < tasks.Count; i++)
                {
                    // Добавление нового экземпляра TaskFill в список, заполненного данными о задаче
                    taskFills.Add(new TaskFill
                    {
                        ID = tasks[i].ID,
                        ExecutorID = tasks[i].ExecutorID,
                        Executor = tasks[i].Executor,
                        Title = tasks[i].Title,
                        Description = tasks[i].Description,
                        CreateDateTime = tasks[i].CreateDateTime,
                        Deadline = tasks[i].Deadline,
                        Difficulty = tasks[i].Difficulty,
                        Time = tasks[i].Time,
                        Status = tasks[i].Status,
                        WorkType = tasks[i].WorkType,
                        CompletedDateTime = tasks[i].CompletedDateTime,
                        IsDeleted = tasks[i].IsDeleted,
                        FioUser = UserInFIO.SoloUser(
                            actualContext.Users.FirstOrDefault(
                                x => x.ID == tasks[i].ExecutorID)),
                        FioManager = UserInFIO.SoloUser(
                            actualContext.Users.FirstOrDefault(
                                x => x.ID == actualContext.Executor.FirstOrDefault(
                                    z => z.ID == tasks[i].ExecutorID).ManagerID))
                    });
                }

                // Фильтрация задач по роли пользователя и сортировка по дате создания в порядке убывания
                if (actualContext.Manager.FirstOrDefault(x => x.ID == user.ID) == null)
                {
                    return taskFills.OrderByDescending(
                    x => x.CreateDateTime).Where(x => x.FioUser == UserInFIO.SoloUser(user)).ToList();
                }
                else
                {
                    return taskFills.OrderByDescending(
                    x => x.CreateDateTime).Where(x => x.FioManager == UserInFIO.SoloUser(user)).ToList();
                }

            }
            catch
            {
                // В случае ошибки выводится сообщение об ошибке
                MessageBox.Show("Ошибка подключения",
                    "Проверьте подключение к интернету",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error);
                return null;
            }
        }

        // Метод TaskFills заполняет список TaskFill данными о всех задачах.
        public static List<TaskFill> TaskFills()
        {
            try
            {
                // Создание экземпляра ActualContext для получения актуальных данных
                ActualContext actualContext = new ActualContext();

                // Получение списка задач из контекста данных, исключая удаленные задачи
                List<Task> tasks = esoftEntities.GetContext().Task.ToList().Where(x => x.IsDeleted == false).ToList();
                List<TaskFill> taskFills = new List<TaskFill>();

                // Проход по каждой задаче
                for (int i = 0; i < tasks.Count; i++)
                {
                    // Добавление нового экземпляра TaskFill в список, заполненного данными о задаче
                    taskFills.Add(new TaskFill
                    {
                        ID = tasks[i].ID,
                        ExecutorID = tasks[i].ExecutorID,
                        Executor = tasks[i].Executor,
                        Title = tasks[i].Title,
                        Description = tasks[i].Description,
                        CreateDateTime = tasks[i].CreateDateTime,
                        Deadline = tasks[i].Deadline,
                        Difficulty = tasks[i].Difficulty,
                        Time = tasks[i].Time,
                        Status = tasks[i].Status,
                        WorkType = tasks[i].WorkType,
                        CompletedDateTime = tasks[i].CompletedDateTime,
                        IsDeleted = tasks[i].IsDeleted,
                        FioUser = UserInFIO.SoloUser(
                            actualContext.Users.FirstOrDefault(
                                x => x.ID == tasks[i].ExecutorID)),
                        FioManager = UserInFIO.SoloUser(
                            actualContext.Users.FirstOrDefault(
                                x => x.ID == actualContext.Executor.FirstOrDefault(
                                    z => z.ID == tasks[i].ExecutorID).ManagerID))
                    });
                }

                // Возвращается список заполненных TaskFill или пустой список в случае ошибки
                return taskFills;
            }
            catch
            {
                // В случае ошибки выводится сообщение об ошибке
                MessageBox.Show("Ошибка подключения",
                    "Проверьте подключение к интернету",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error);
                return null;
            }
        }
    }
}