using Demo.Data.Repository; // Для доступа к репозиториям данных

namespace Demo.Domain.UseCase
{
    public class GroupAttendanceService
    {
        private readonly IPresenceRepository _presenceRepository;
        private readonly IUserRepository _userRepository; // Добавляем репозиторий пользователей

        public GroupAttendanceService(IPresenceRepository presenceRepository, IUserRepository userRepository)
        {
            _presenceRepository = presenceRepository;
            _userRepository = userRepository; // Инициализируем репозиторий пользователей
        }

        public void DisplayGroupAttendanceInfo(int groupId)
        {
            // Получаем данные о посещаемости для группы с ID groupId
            var presences = _presenceRepository.GetPresenceByGroup(groupId);

            // Проверяем, есть ли данные о посещаемости для группы
            if (presences == null || !presences.Any())
            {
                Console.WriteLine("Нет данных о посещаемости для группы с ID: " + groupId);
                return;
            }

            // Вычисление количества студентов
            var totalStudents = presences.Select(p => p.UserGuid).Distinct().Count(); // Предполагается, что в PresenceLocalEntity есть UserGuid
            var totalSessions = presences.Select(p => p.Date).Distinct().Count();// Вычисление количества проведенных занятий 
            var totalAttendance = presences.Count(p => p.IsAttedance);// Общее количество присутствий

            // Общий процент посещаемости
            double overallAttendancePercentage = totalSessions > 0  ? (double)totalAttendance / (totalSessions * totalStudents) * 100 : 0;

            Console.WriteLine($"Группа ID: {groupId}");
            Console.WriteLine($"Количество студентов: {totalStudents}");
            Console.WriteLine($"Количество проведенных занятий: {totalSessions}");
            Console.WriteLine($"Общий процент посещаемости: {overallAttendancePercentage:F2}%");
            Console.WriteLine("Студенты:");

            // Вывод информации по каждому студенту
            var studentAttendances = presences.GroupBy(p => p.UserGuid).Select(g => new
                {
                    StudentName = GetStudentNameByGuid(g.Key), // Получение имени студента по его GUID
                    AttendedCount = g.Count(p => p.IsAttedance), // Подсчет количества посещений
                    MissedCount = g.Count(p => !p.IsAttedance) // Подсчет количества пропусков
                });

            foreach (var student in studentAttendances)
            {
                // Процент посещаемости студента
                double attendancePercentage = totalSessions > 0
                    ? (double)student.AttendedCount / totalSessions * 100
                    : 0;

                var attendanceColor = attendancePercentage < 40 ? "\u001b[31m" : "\u001b[0m"; // Красный для низкого процента
                Console.WriteLine($"{attendanceColor}{student.StudentName} - Посещено: {student.AttendedCount}, Пропущено: {student.MissedCount}, Процент посещаемости: {attendancePercentage:F2}%\u001b[0m");
            }
        }

        // Метод для получения имени студента по его GUID
        private string GetStudentNameByGuid(Guid userGuid)
        {
            var user = _userRepository.GetAllUsers.FirstOrDefault(u => u.Guid == userGuid);
            return user != null ? user.FIO : "Неизвестный студент"; // Возвращаем имя студента или "Неизвестный студент"
        }
    }
}
