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

namespace Demo.UI
{
    public class MainMenuUI
    {
        private readonly UserConsoleUI _userConsoleUI;
        private readonly GroupConsoleUI _groupConsoleUI;
        private readonly PresenceConsole _presenceConsoleUI;

        public MainMenuUI(UserUseCase userUseCase, GroupUseCase groupUseCase, UseCaseGeneratePresence presenceUseCase, IPresenceRepository presenceRepository)
        {
            _userConsoleUI = new UserConsoleUI(userUseCase);
            _groupConsoleUI = new GroupConsoleUI(groupUseCase);
            _presenceConsoleUI = new PresenceConsole(presenceUseCase, presenceRepository); // Передаем presenceRepository
        }


        public void DisplayMenu()
        {
            while (true)
            {
                Console.WriteLine("\n==================== Главная Панель ====================\n");

                Console.WriteLine("~~~~~~~~~~~~~~~ УПРАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯМИ ~~~~~~~~~~~~~~~");
                Console.WriteLine("1. Показать список всех пользователей");
                Console.WriteLine("2. Удалить пользователя по его Guid");
                Console.WriteLine("3. Обновить данные пользователя по Guid");
                Console.WriteLine("4. Найти пользователя по его Guid");
                Console.WriteLine();

                Console.WriteLine("~~~~~~~~~~~~~~~ УПРАВЛЕНИЕ ГРУППАМИ ~~~~~~~~~~~~~~~");
                Console.WriteLine("5. Показать список всех групп");
                Console.WriteLine("6. Создать новую группу");
                Console.WriteLine("7. Удалить группу по ID");
                Console.WriteLine("8. Изменить название существующей группы");
                Console.WriteLine("9. Найти группу по ее ID");
                Console.WriteLine();

                Console.WriteLine("~~~~~~~~~~~~~~~ УПРАВЛЕНИЕ ПОСЕЩАЕМОСТЬЮ ~~~~~~~~~~~~~~~");
                Console.WriteLine("10. Сгенерировать посещаемость на текущий день");
                Console.WriteLine("11. Сгенерировать посещаемость на текущую неделю");
                Console.WriteLine("12. Показать посещаемость всех пользователей");
                Console.WriteLine("13. Отметить пользователя как отсутствующего");
                Console.WriteLine("14. Вывести посещаемость группы по ID");
                Console.WriteLine("15. Создать Excel файл");
                Console.WriteLine("16. Информация о посещаемости");

                Console.WriteLine();

                Console.WriteLine("========================================================");
                Console.WriteLine("0. Выход из программы");

                Console.Write("\nВыберите команду: ");
                string command = Console.ReadLine();
                Console.WriteLine();

                switch (command)
                {
                    case "1":
                        _userConsoleUI.DisplayAllUsers();
                        break;

                    case "2":
                        Console.Write("Введите Guid пользователя для удаления: ");
                        if (Guid.TryParse(Console.ReadLine(), out Guid userGuid))
                        {
                            _userConsoleUI.RemoveUserById(userGuid);
                        }
                        else
                        {
                            Console.WriteLine("Неверный формат Guid");
                        }
                        break;

                    case "3":
                        Console.Write("Введите Guid пользователя для обновления: ");
                        if (Guid.TryParse(Console.ReadLine(), out Guid updateUserGuid))
                        {
                            _userConsoleUI.UpdateUserById(updateUserGuid);
                        }
                        else
                        {
                            Console.WriteLine("Неверный формат Guid");
                        }
                        break;

                    case "4":
                        Console.Write("Введите Guid пользователя для поиска: ");
                        if (Guid.TryParse(Console.ReadLine(), out Guid findUserGuid))
                        {
                            _userConsoleUI.FindUserById(findUserGuid);
                        }
                        else
                        {
                            Console.WriteLine("Неверный формат Guid");
                        }
                        break;

                    case "5":
                        _groupConsoleUI.DisplayAllGroups();
                        break;

                    case "6":
                        Console.Write("Введите название новой группы: ");
                        string newGroupName = Console.ReadLine();
                        _groupConsoleUI.AddGroup(newGroupName);
                        break;

                    case "7":
                        Console.Write("Введите ID группы для удаления: ");
                        string groupIdForDeleteStr = Console.ReadLine(); // Считываем ID как строку
                        if (!string.IsNullOrWhiteSpace(groupIdForDeleteStr) && int.TryParse(groupIdForDeleteStr, out int groupIdForDelete)) // Проверяем, что строка не пустая и может быть преобразована в int
                        {
                            _groupConsoleUI.RemoveGroup(groupIdForDeleteStr); // Передаем строку в метод
                        }
                        else
                        {
                            Console.WriteLine("Неверный формат ID группы");
                        }
                        break;

                    case "8":
                        Console.Write("Введите ID группы для изменения: ");
                        if (int.TryParse(Console.ReadLine(), out int groupIdToUpdate))
                        {
                            Console.Write("Введите новое название группы: ");
                            string newName = Console.ReadLine();
                            _groupConsoleUI.UpdateGroupName(groupIdToUpdate, newName);
                        }
                        else
                        {
                            Console.WriteLine("Неверный формат ID группы");
                        }
                        break;

                    case "9":
                        Console.Write("Введите ID группы для поиска: ");
                        if (int.TryParse(Console.ReadLine(), out int idGroupToFind))
                        {
                            _groupConsoleUI.FindGroupById(idGroupToFind);
                        }
                        else
                        {
                            Console.WriteLine("Неверный формат ID группы");
                        }
                        break;

                    case "10":
                        Console.Write("Введите номер первого занятия: ");
                        int firstLesson = int.Parse(Console.ReadLine());
                        Console.Write("Введите номер последнего занятия: ");
                        int lastLesson = int.Parse(Console.ReadLine());
                        Console.Write("Введите ID группы: ");
                        int groupIdForPresence = int.Parse(Console.ReadLine());

                        _presenceConsoleUI.GeneratePresenceForDay(DateTime.Now, groupIdForPresence, firstLesson, lastLesson);
                        Console.WriteLine("Посещаемость на день сгенерирована.");
                        break;

                    case "11":
                        Console.Write("Введите номер первого занятия: ");
                        int firstLessonForWeek = int.Parse(Console.ReadLine());
                        Console.Write("Введите номер последнего занятия: ");
                        int lastLessonForWeek = int.Parse(Console.ReadLine());
                        Console.Write("Введите ID группы: ");
                        int groupIdForWeekPresence = int.Parse(Console.ReadLine());

                        _presenceConsoleUI.GeneratePresenceForWeek(DateTime.Now, groupIdForWeekPresence, firstLessonForWeek, lastLessonForWeek);
                        Console.WriteLine("Посещаемость на неделю сгенерирована.");
                        break;

                    case "12":
                        Console.Write("Введите дату (гггг-мм-дд): ");
                        DateTime date = DateTime.Parse(Console.ReadLine());
                        Console.Write("Введите ID группы: ");
                        int groupForPresenceView = int.Parse(Console.ReadLine());

                        _presenceConsoleUI.DisplayPresence(date, groupForPresenceView);
                        break;

                    case "13":
                        Console.Write("Введите  пользователя: ");
                        userGuid = Guid.Parse(Console.ReadLine());
                        Console.Write("Введите номер первого занятия: ");
                        int firstAbsLesson = int.Parse(Console.ReadLine());
                        Console.Write("Введите номер последнего занятия: ");
                        int lastAbsLesson = int.Parse(Console.ReadLine());
                        Console.Write("Введите ID группы: ");
                        int absGroupId = int.Parse(Console.ReadLine());

                        _presenceConsoleUI.MarkUserAsAbsent(DateTime.Now, absGroupId, userGuid, firstAbsLesson, lastAbsLesson);
                        Console.WriteLine("Пользователь отмечен как отсутствующий.");
                        break;

                    case "14":
                        Console.Write("Введите ID группы: ");
                        int groupIdForAllPresence = int.Parse(Console.ReadLine());
                        _presenceConsoleUI.DisplayAllPresenceByGroup(groupIdForAllPresence);
                        break;



                    case "15":
                        _presenceConsoleUI.ExportAttendanceToExcel();
                        break;

                    case "16":
                        Console.Write("Введите ID группы: ");
                        int searchGroupId = int.Parse(Console.ReadLine());
                        _presenceConsoleUI.DisplayGeneralPresenceForGroup(searchGroupId);
                        break;

                    case "0":
                        Console.WriteLine("Выход...");
                        return;

                    default:
                        Console.WriteLine("Неверный выбор, попробуйте снова.");
                        break;
                }
                Console.WriteLine();
            }
        }
    }
}
