using esoft.Entities;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace esoft.Class
{
    // Класс ExecuterFill наследуется от класса User и предоставляет методы для заполнения данных исполнителей и получения статистики по задачам.
    public class ExecuterFill : User
    {
        string grade;          // Уровень Менеджера
        int managerID;        // Менеджер, которому подчиняется Исполнитель
        string fioUser;      // ФИО Исполнителя
        string fioManager;  // ФИО Менеджера

        int numberTasks_Plan;         // Количество задач, запланированных
        int numberTasks_Executed;    // Количество задач, исполняемых
        int numberTasks_Done;       // Количество выполненных задач
        int numberTasks_Сancelled; // Количество отмененных задач

        public string Grade
        {
            get { return grade; }
            set { grade = value; }
        }

        public int ManagerID
        {
            get { return managerID; }
            set { managerID = value; }
        }

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

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

        public int NumberTask_Plan
        {
            get { return numberTasks_Plan; }
            set { numberTasks_Plan = value; }
        }

        public int NumberTask_Executed
        {
            get { return numberTasks_Executed; }
            set { numberTasks_Executed = value; }
        }

        public int NumberTask_Done
        {
            get { return numberTasks_Done; }
            set { numberTasks_Done = value; }
        }

        public int NumberTask_Сancelled
        {
            get { return numberTasks_Сancelled; }
            set { numberTasks_Сancelled = value; }
        }

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

                // Получение списка исполнителей и пользователей из контекста данных
                List<esoft.Entities.Executor> executors = esoftEntities.GetContext().Executor.ToList();
                List<User> users = esoftEntities.GetContext().User.ToList();

                // Проход по каждому пользователю и исполнителю
                foreach (var user in users)
                {
                    foreach (var executer in executors)
                    {
                        // Проверка соответствия пользователя и исполнителя
                        if (user.ID == executer.ID)
                        {
                            // Добавление нового экземпляра ExecuterFill в список, заполненного данными пользователя и исполнителя
                            executerFills.Add(new ExecuterFill
                            {
                                ID = user.ID,
                                Password = user.Password,
                                FirstName = user.FirstName,
                                MiddleName = user.MiddleName,
                                LastName = user.LastName,
                                Login = user.Login,
                                IsDeleted = user.IsDeleted,
                                FioUser = UserInFIO.SoloUser(user),
                                Grade = executer.Grade,
                                managerID = executer.ManagerID,
                                FioManager = UserInFIO.SoloUser(
                                    actualContext.Users.FirstOrDefault(
                                        x => x.ID == actualContext.Executor.FirstOrDefault(
                                            z => z.ID == executer.ID).ManagerID)),
                                NumberTask_Plan = GetPlanTaskCountForExecutor(executer.ID),
                                NumberTask_Executed = GetExecutedTaskCountForExecutor(executer.ID),
                                NumberTask_Done = GetDoneTaskCountForExecutor(executer.ID),
                                NumberTask_Сancelled = GetCancelledTaskCountForExecutor(executer.ID),
                            });
                        }
                    }
                }
            }
            catch
            {
                // В случае ошибки выводится сообщение об ошибке
                MessageBox.Show("Ошибка заполнения списка Исполнителей",
                    "Ошибка",
                    MessageBoxButton.OK,
                    MessageBoxImage.Error);
            }

            // Возвращается список заполненных ExecuterFill или пустой список в случае ошибки
            return executerFills;
        }

        // Метод GetPlanTaskCountForExecutor возвращает количество запланированных задач для указанного исполнителя.
        private static int GetPlanTaskCountForExecutor(int executorID)
        {
            ActualContext actualContext = new ActualContext();
            {
                return actualContext.Tasks.Count(task => task.ExecutorID == executorID && task.Status == "запланирована");
            }
        }

        // Метод GetExecutedTaskCountForExecutor возвращает количество исполняемых задач для указанного исполнителя.
        private static int GetExecutedTaskCountForExecutor(int executorID)
        {
            ActualContext actualContext = new ActualContext();
            {
                return actualContext.Tasks.Count(task => task.ExecutorID == executorID && task.Status == "исполняется");
            }
        }

        // Метод GetDoneTaskCountForExecutor возвращает количество выполненных задач для указанного исполнителя.
        private static int GetDoneTaskCountForExecutor(int executorID)
        {
            ActualContext actualContext = new ActualContext();
            {
                return actualContext.Tasks.Count(task => task.ExecutorID == executorID && task.Status == "выполнена");
            }
        }

        // Метод GetCancelledTaskCountForExecutor возвращает количество отмененных задач для указанного исполнителя.
        private static int GetCancelledTaskCountForExecutor(int executorID)
        {
            ActualContext actualContext = new ActualContext();
            {
                return actualContext.Tasks.Count(task => task.ExecutorID == executorID && task.Status == "отменена");
            }
        }
    }
}
