using Demo.Domain.Models;
using Demo.Domain.UseCase;

namespace Demo.UI
{
    public class MainMenuUI
    {
       
        UserConsoleUI _userConsoleUI;
        GroupConsoleUI _groupConsoleUI;
        PresenceConsoleUI _presenceConsoleUI;
        AdminConsoleUI _adminConsoleUI;

        public MainMenuUI(IUserUseCase userUseCase, IGroupUseCase groupUseCase, IPresenceUseCase presenceUseCase, IAdminUseCase adminUseCase) { 
        _userConsoleUI = new UserConsoleUI(userUseCase);
        _groupConsoleUI = new GroupConsoleUI(groupUseCase, userUseCase, presenceUseCase);
        _presenceConsoleUI = new PresenceConsoleUI(presenceUseCase);
        _adminConsoleUI = new AdminConsoleUI(adminUseCase);
            SelectRole();
            
        }

        private void SelectRole()
        {
            Console.WriteLine("Выберите роль:\n1: user\n2: admin");
            string role = Console.ReadLine();

            if (role == "1")
            {
                DisplayMenu();
            }
            else if (role == "2")
            {
                DisplayAdminMenu();
            }
            else
            {
                Console.WriteLine("Неверная роль. Попробуйте еще раз.");
                SelectRole();
            }
        }

        private void DisplayAdminMenu()
        {
            Console.WriteLine("0) Создать таблицу посещаемости для группы");
            while(true)
            {
                switch (Console.ReadLine())
                {
                    case "0": Console.WriteLine("Введите номер группы");
                            _adminConsoleUI.ExcelExport(Convert.ToInt32(Console.ReadLine())); break;

                    default: DisplayAdminMenu();
                        break;
                }
            }
        }

        private void DisplayMenu() {
            Console.WriteLine("0) Вывести всё о группе\n1) Вывести все группы\n2) Cоздать новую группу\n3) Обновить имя группы\n4) Вывести группу по ID\n5) Удалить группу по ID\n6) Вывести всех юзеров\n7) Вывести юзера по GUID\n8) Обновить юзера по GUID\n9) Удалить юзера по GUID\n10) Тебе этого не надо\n11) Вывести посещаемость по группе\n12) Вывести посещаемость по группе и времени\n13) Генерация посещаемости\n14) Генерация посещаемости на неделю\n15) Смена посещаемости юзера");
            while (true)
            {
                switch (Console.ReadLine())
                {

                    case "0": Console.WriteLine("Введите номер группы");
                            _groupConsoleUI.DisplayAllBoutGroup(Convert.ToInt32(Console.ReadLine())); break;
                    case "1": _groupConsoleUI.DisplayAllGroups(); break;
                    case "2": Console.WriteLine("Введите имя группы");
                            _groupConsoleUI.CreateNewGroup(Console.ReadLine()); break;
                    case "3": Console.WriteLine("Введите номер и имя группы");
                            _groupConsoleUI.UpdateGroupName(Group.Parse(Console.ReadLine())); break;
                    case "4": Console.WriteLine("Введите номер группы");
                            _groupConsoleUI.DisplayGroupByID(Convert.ToInt32(Console.ReadLine())); break;
                    case "5": Console.WriteLine("Введите номер группы");
                            _groupConsoleUI.RemoveGroupByID(Convert.ToInt32(Console.ReadLine())); break;

                    case "6": _userConsoleUI.DisplayAllUsers(); break;
                    case "7": Console.WriteLine("Введите Guid юзера");
                            _userConsoleUI.DisplayUserByGuid(Guid.Parse(Console.ReadLine())); break;
                    case "8": Console.WriteLine("Введите Guid юзера");
                            _userConsoleUI.UpdateUserByGuid(User.Parse(Console.ReadLine())); break;
                    case "9": Console.WriteLine("Введите Guid юзера");
                            _userConsoleUI.RemoveUserByGuid(Guid.Parse(Console.ReadLine())); break;
                    
                    case "10": Console.WriteLine("писяпопакака"); break;

                    case "11": Console.WriteLine("Введите номер группы");
                            _presenceConsoleUI.DisplayPresenceByGroup(Convert.ToInt32(Console.ReadLine())); break;
                    case "12": Console.WriteLine("Введите номер группы и дату");
                             _presenceConsoleUI.DisplayPresenceByGroupByTime(Convert.ToInt32(Console.ReadLine()), DateOnly.FromDateTime(Convert.ToDateTime(Console.ReadLine()))); break;
                    case "13": Console.WriteLine("Введите первый и последний урок, номер группы и дату");
                            _presenceConsoleUI.GeneratePresence(Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()), DateOnly.FromDateTime(Convert.ToDateTime(Console.ReadLine()))); break;
                    case "14": Console.WriteLine("Введите первый и последний урок, номер группы и дату");
                            _presenceConsoleUI.GeneratePresenceWeek(Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()), DateOnly.FromDateTime(Convert.ToDateTime(Console.ReadLine()))); break;
                    case "15": Console.WriteLine("Введите первый и последний урок, дату и Guid юзера");
                            _presenceConsoleUI.IsAttedance(Convert.ToInt32(Console.ReadLine()), Convert.ToInt32(Console.ReadLine()), DateOnly.FromDateTime(Convert.ToDateTime(Console.ReadLine())), Guid.Parse(Console.ReadLine())); break;

                    default: DisplayMenu();
                        break;
                }
            }
        }
    }
}