using Demo.Data.Repository;
using Demo.domain.Models;
using Demo.Domain.UseCase;
using System;
using System.Collections.Generic;

namespace Demo.UI
{
    public class PresenceConsole
    {
        private readonly UseCaseGeneratePresence _presenceUseCase;
        private readonly IPresenceRepository _presenceRepository;

        public PresenceConsole(UseCaseGeneratePresence presenceUseCase, IPresenceRepository presenceRepository)
        {
            _presenceUseCase = presenceUseCase;
            _presenceRepository = presenceRepository;
        }

        // Метод для генерации посещаемости на день
        public void GeneratePresenceForDay(DateTime date, int groupId, int firstLesson, int lastLesson)
        {
            try
            {
                _presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId, date);
                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<PresenceLocalEntity> presences = _presenceUseCase.GetPresenceByGroupAndDate(groupId, date);

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

                Console.WriteLine($"\n                Посещаемость на {date:dd.MM.yyyy}                ");
                Console.WriteLine("-----------------------------------------------------");

                // Сохраняем номер занятия для сравнения
                int previousLessonNumber = -1;

                foreach (var presence in presences)
                {
                    // Проверяем, изменился ли номер занятия
                    if (previousLessonNumber != presence.LessonNumber)
                    {
                        Console.WriteLine("-----------------------------------------------------");
                        Console.WriteLine($"                   Занятие: {presence.LessonNumber}                   ");
                        Console.WriteLine("-----------------------------------------------------");
                        previousLessonNumber = presence.LessonNumber;
                    }

                    // Форматируем статус присутствия
                    string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
                    Console.WriteLine($"Пользователь (ID: {presence.UserGuid}) - Статус: {status}");
                }

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


        public void MarkUserAsAbsent(DateTime date, int groupId, Guid userGuid, int firstLesson, int lastLesson)
        {
            _presenceUseCase.MarkUserAsAbsent(userGuid, groupId, firstLesson, lastLesson, date);
        }




        public void DisplayAllPresenceByGroup(int groupId)
        {
            try
            {
                var presences = _presenceUseCase.GetAllPresenceByGroup(groupId);

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

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

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

                    // Сохраняем номер занятия для сравнения
                    int previousLessonNumber = -1;

                    foreach (var presence in group)
                    {
                        // Проверяем, изменился ли номер занятия
                        if (previousLessonNumber != presence.LessonNumber)
                        {
                            Console.WriteLine("---------------------------------------------------");
                            Console.WriteLine($"              Занятие: {presence.LessonNumber}               ");
                            Console.WriteLine("---------------------------------------------------");
                            previousLessonNumber = presence.LessonNumber;
                        }

                        // Форматируем статус присутствия
                        string status = presence.IsAttedance ? "✅ Присутствует" : "❌ Отсутствует";
                        Console.WriteLine($"Пользователь (ID: {presence.UserGuid}) - Статус: {status}");
                    }

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

        public void DisplayGeneralPresenceForGroup(int groupId)
        {
            var summary = _presenceRepository.GetGeneralPresenceForGroup(groupId);

            Console.WriteLine($"Человек в группе: {summary.UserCount}, " +
                              $"Количество проведённых занятий: {summary.LessonCount}, " +
                              $"Общий процент посещаемости группы: {summary.TotalAttendancePercentage}%");

            foreach (var user in summary.UserAttendances)
            {
                if (user.AttendanceRate < 40)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                }

                Console.WriteLine($"GUID Пользователя: {user.UserGuid}, " +
                                  $"Посетил: {user.Attended}, " +
                                  $"Пропустил: {user.Missed}, " +
                                  $"Процент посещаемости: {user.AttendanceRate}%");
                Console.ResetColor();
            }
        }
        public void ExportAttendanceToExcel()
        {
            try
            {
                _presenceUseCase.ExportAttendanceToExcel();
                Console.WriteLine("Данные посещаемости успешно экспортированы в Excel.");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Ошибка при экспорте посещаемости: {ex.Message}");
            }
        }

        public void UpdateUserAttendance(Guid userGuid, int groupId, int firstLesson, int lastLesson, DateOnly date, bool isAttendance)
        {
            try
            {
                bool result = _presenceRepository.UpdateAtt(userGuid, groupId, firstLesson, lastLesson, date, isAttendance);

                if (result)
                {
                    Console.WriteLine($"Статус посещаемости для пользователя {userGuid} обновлён.");
                }
                else
                {
                    Console.WriteLine($"Данные о посещаемости для пользователя ID: {userGuid} не найдены.");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Ошибка при обновлении посещаемости: {ex.Message}");
            }
        }

    }



}

