using System;
using System.Globalization;
using Demo.Domain.UseCase;
using Demo.Data.Repository;
using Demo.Data.LocalData.Entity;
using Demo.Data.Exceptions;
using AttendanceApp.Domain.Models;

namespace AttendanceApp.UI
{
    public class PresenceConsole
    {
        private readonly UseCaseGeneratePresence _generatePresenceUseCase;
        private readonly IPresenceRepository _presenceRepository;
        private readonly IGroupRepository _groupRepository;

        public PresenceConsole(UseCaseGeneratePresence generatePresenceUseCase, IPresenceRepository presenceRepository, IGroupRepository groupRepository)
        {
            _generatePresenceUseCase = generatePresenceUseCase;
            _presenceRepository = presenceRepository;
            _groupRepository = groupRepository;
        }

        public void GenerateDailyPresence()
        {
            Console.Clear();
            Console.WriteLine("=== Генерация посещаемости на текущий день ===");
            Console.Write("Введите номер первого занятия: ");
            var firstClassInput = Console.ReadLine();
            Console.Write("Введите номер последнего занятия: ");
            var lastClassInput = Console.ReadLine();
            Console.Write("Введите ID группы: ");
            var groupIdInput = Console.ReadLine();
            var currentDate = DateTime.Now.Date;

            if (int.TryParse(firstClassInput, out int firstClassNum)
                && int.TryParse(lastClassInput, out int lastClassNum)
                && int.TryParse(groupIdInput, out int groupId))
            {
                try
                {
                    _generatePresenceUseCase.GenerateDailyPresence(firstClassNum, lastClassNum, groupId, currentDate);
                    Console.WriteLine("Посещаемость успешно сгенерирована на текущий день.");
                }
                catch (GroupNotFoundException ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            else
            {
                Console.WriteLine("Неверный формат ввода.");
            }

            Console.WriteLine("Нажмите любую клавишу для продолжения...");
            Console.ReadKey();
        }

        public void GenerateWeeklyPresence()
        {
            Console.Clear();
            Console.WriteLine("=== Генерация посещаемости на неделю ===");
            Console.Write("Введите номер первого занятия: ");
            var firstClassInput = Console.ReadLine();
            Console.Write("Введите номер последнего занятия: ");
            var lastClassInput = Console.ReadLine();
            Console.Write("Введите ID группы: ");
            var groupIdInput = Console.ReadLine();
            Console.Write("Введите стартовую дату (yyyy-MM-dd): ");
            var startDateInput = Console.ReadLine();

            if (int.TryParse(firstClassInput, out int firstClassNum)
                && int.TryParse(lastClassInput, out int lastClassNum)
                && int.TryParse(groupIdInput, out int groupId)
                && DateTime.TryParseExact(startDateInput, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime startDate))
            {
                try
                {
                    _generatePresenceUseCase.GenerateWeeklyPresence(firstClassNum, lastClassNum, groupId, startDate);
                    Console.WriteLine("Посещаемость успешно сгенерирована на неделю.");
                }
                catch (GroupNotFoundException ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            else
            {
                Console.WriteLine("Неверный формат ввода.");
            }

            Console.WriteLine("Нажмите любую клавишу для продолжения...");
            Console.ReadKey();
        }

        public void ShowPresenceByGroupAndDate()
        {
            Console.Clear();
            Console.WriteLine("=== Показать посещаемость по группе и дате ===");
            Console.Write("Введите ID группы: ");
            var groupIdInput = Console.ReadLine();
            Console.Write("Введите дату (yyyy-MM-dd): ");
            var dateInput = Console.ReadLine();

            if (int.TryParse(groupIdInput, out int groupId) && DateTime.TryParse(dateInput, out DateTime date))
            {
                try
                {
                    var group = _groupRepository.GetGroupById(groupId);
                    // Добавляем проверку на null
                    if (group == null)
                    {
                        Console.WriteLine($"Группа с ID {groupId} не найдена.");
                        Console.WriteLine("Нажмите любую клавишу для продолжения...");
                        Console.ReadKey();
                        return;
                    }

                    var presences = _presenceRepository.GetPresencesByGroupAndDate(groupId, date);
                    Console.WriteLine($"Посещаемость группы {group.Name} на {date.ToShortDateString()}:");
                    foreach (var presence in presences)
                    {
                        Console.WriteLine($"Пользователь ID: {presence.UserId} | Занятие №: {presence.LessonNumber} | Присутствует: {presence.WasPresent}");
                    }
                }
                catch (GroupNotFoundException ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            else
            {
                Console.WriteLine("Неверный формат ввода.");
            }

            Console.WriteLine("Нажмите любую клавишу для продолжения...");
            Console.ReadKey();
        }

        public void MarkUserAbsent()
        {
            Console.Clear();
            Console.WriteLine("=== Отметить пользователя как отсутствующего ===");
            Console.Write("Введите ID пользователя (GUID): ");
            var userIdInput = Console.ReadLine();
            Console.Write("Введите диапазон занятий (через запятую, например: 1,3): ");
            var classRangeInput = Console.ReadLine();

            if (Guid.TryParse(userIdInput, out Guid userId)
                && classRangeInput.Contains(",")
                && int.TryParse(classRangeInput.Split(',')[0], out int startClass)
                && int.TryParse(classRangeInput.Split(',')[1], out int endClass))
            {
                try
                {
                    var currentDate = DateTime.Now.Date;
                    for (int classNum = startClass; classNum <= endClass; classNum++)
                    {
                        var presence = new Presence
                        {
                            ClassDate = currentDate,
                            LessonNumber = classNum,
                            WasPresent = false,
                            UserId = userId
                        };
                        _presenceRepository.UpdatePresence(presence);
                    }
                    Console.WriteLine("Пользователь успешно отмечен как отсутствующий на указанных занятиях.");
                }
                catch (RepositoryException ex)
                {
                    Console.WriteLine($"Ошибка: {ex.Message}");
                }
            }
            else
            {
                Console.WriteLine("Неверный формат ввода.");
            }

            Console.WriteLine("Нажмите любую клавишу для продолжения...");
            Console.ReadKey();
        }

        public void ShowPresenceByGroup()
        {
            Console.Clear();
            Console.WriteLine("=== Показать посещаемость по группе ===");
            Console.Write("Введите ID группы: ");
            var groupIdInput = Console.ReadLine();

            if (int.TryParse(groupIdInput, out int groupId))
            {
                try
                {
                    var group = _groupRepository.GetGroupById(groupId);
                    var presences = _presenceRepository.GetPresenceByGroup(groupId);

                    Console.WriteLine($"Посещаемость группы {group.Name}:");
                    foreach (var presence in presences)
                    {
                        Console.WriteLine($"Дата: {presence.ClassDate.ToShortDateString()} | " +
                                          $"Занятие №{presence.LessonNumber} | " +
                                          $"Присутствует: {(presence.WasPresent ? "Да" : "Нет")} | " +
                                          $"Студент ID: {presence.UserId}");
                    }
                }
                catch (GroupNotFoundException ex)
                {
                    Console.WriteLine($"Ошибка: {ex.Message}");
                }
            }
            else
            {
                Console.WriteLine("Неверный формат ID группы.");
            }

            Console.WriteLine("\nНажмите любую клавишу для продолжения...");
            Console.ReadKey();
        }
    }
}