using System;
using data.Domain.UseCase;
using data.Exceptions;
using data.domain.Models;
using data.Domain.UseCase;
using System.Collections.Generic;
using data.RemoteData.RemoteDataBase.DAO;

namespace ui
{
    public class PresenceConsoleUI
    {
        private readonly UseCaseGeneratePresence _presenceUseCase;

        public PresenceConsoleUI(UseCaseGeneratePresence presenceUseCase)
        {
            _presenceUseCase = presenceUseCase;
        }

        public void ExportAttendanceToExcel()
        {
            try
            {
                _presenceUseCase.ExportAttendanceToExcel();
                Console.WriteLine("Данные посещаемости успешно экспортированы в Excel.");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Ошибка при экспорте посещаемости: {ex.Message}");
            }
        }



        // Метод для генерации посещаемости на день
        public void GeneratePresenceForDay(DateTime date, int groupId, int firstLesson, int lastLesson)
        {
            try
            {
                _presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId);
                Console.WriteLine("Посещаемость на день успешно сгенерирована.");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
            }
        }

        // Метод для генерации посещаемости на неделю
        public void GeneratePresenceForWeek(DateTime date, int groupId, int firstLesson, int lastLesson)
        {
            try
            {
                _presenceUseCase.GenerateWeeklyPresence(firstLesson, lastLesson, groupId, date);
                Console.WriteLine("Посещаемость на неделю успешно сгенерирована.");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
            }
        }

        // Метод для отображения посещаемости на конкретную дату и группу
        public void DisplayPresence(DateTime date, int groupId)
        {
            try
            {
                List<PresenceDao> presences = _presenceUseCase.GetPresenceByDateAndGroup(date, groupId);

                if (presences == null || presences.Count == 0)
                {
                    Console.WriteLine("Посещаемость на выбранную дату отсутствует.");
                    return;
                }

                // Сортируем присутствия по номеру занятия и ID пользователя
                var sortedPresences = presences.OrderBy(p => p.LessonNumber)
                                                .ThenBy(p => p.UserId);

                Console.WriteLine($"\nПосещаемость на {date.ToShortDateString()} для группы с ID {groupId}:");
                Console.WriteLine("---------------------------------------------");

                int previousLessonNumber = -1; // Инициализация для сравнения
                foreach (var presence in sortedPresences)
                {
                    if (previousLessonNumber != presence.LessonNumber)
                    {
                        Console.WriteLine("---------------------------------------------");
                        previousLessonNumber = presence.LessonNumber;
                    }
                    string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
                    Console.WriteLine($"Пользователь ID: {presence.UserId}, Занятие {presence.LessonNumber}: {status}");
                }
                Console.WriteLine("---------------------------------------------");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Ошибка при выводе посещаемости: {ex.Message}");
            }

        }

        public void MarkUserAbsent(DateTime date, int groupId, int userId, int firstLesson, int lastLesson)
        {
            bool check = _presenceUseCase.MarkUserAbsentForLessons(userId, groupId, firstLesson, lastLesson, date);
            if (check)
            {
                Console.WriteLine("Пользователь отмечен как осутсвующий");
            }
            else
            {
                Console.WriteLine($"Посещаемость для пользователя ID: {userId} на дату {date.ToShortDateString()}" +
                  $" с {firstLesson} по {lastLesson} уроки не найдена.");
            }
        }

        public void DisplayGeneralPresence(int groupId)
        {
            var statistics = _presenceUseCase.GetGeneralPresence(groupId);
            Console.WriteLine($"Человек в группе: {statistics.UserCount}, " +
                              $"Количество проведённых занятий: {statistics.TotalLessons}, " +
                              $"Общий процент посещаемости группы: {statistics.AttendancePercentage}%");

            foreach (var user in statistics.UserAttendanceDetails)
            {
                Console.ForegroundColor = user.AttendanceRate < 40 ? ConsoleColor.Red : ConsoleColor.White;
                Console.WriteLine($"ID Пользователя: {user.UserId}, Посетил: {user.Attended}, " +
                                  $"Пропустил: {user.Missed}, Процент посещаемости: {user.AttendanceRate}%");
            }
            Console.ForegroundColor = ConsoleColor.White;
        }



        public void DisplayAllPresenceByGroup(int groupId)
        {
            try
            {
                // Получаем все посещения для группы
                var presences = _presenceUseCase.GetAllPresenceByGroup(groupId);

                if (presences == null || presences.Count == 0)
                {
                    Console.WriteLine($"Посещаемость для группы с ID {groupId} отсутствует.");
                    return;
                }

                // Группируем по дате
                var groupedPresences = presences.GroupBy(p => p.Date);

                foreach (var group in groupedPresences)
                {
                    Console.WriteLine("===================================================");
                    Console.WriteLine($"Дата: {group.Key.ToString("dd.MM.yyyy")}");
                    Console.WriteLine("===================================================");

                    // Группируем по занятию
                    var groupedByLesson = group.GroupBy(p => p.LessonNumber);

                    foreach (var lessonGroup in groupedByLesson)
                    {
                        Console.WriteLine($"Занятие {lessonGroup.Key}:");

                        // Создаем HashSet для уникальных пользователей
                        var userIds = new HashSet<int>();

                        foreach (var presence in lessonGroup)
                        {
                            // Проверяем, добавляется ли пользователь в HashSet
                            if (userIds.Add(presence.UserId))
                            {
                                string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
                                Console.WriteLine($"Пользователь ID: {presence.UserId}, Статус: {status}");
                            }
                        }

                        Console.WriteLine("---------------------------------------------------");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Ошибка при выводе посещаемости: {ex.Message}");
            }
        }


    }
}