using domain.Models;
using domain.UseCase;


namespace ui
{
    // Класс пользовательского интерфейса для работы с пользователями через консоль.
    public class UserConsole
    {
        private readonly UserUseCase _userUseCase;

        // Конструктор, принимающий экземпляр пользовательского UseCase.
        public UserConsole(UserUseCase userUseCase)
        {
            _userUseCase = userUseCase;
        }

        // Метод для отображения всех пользователей.
        public void AllUsers()
        {
            // Получаем список всех пользователей.
            var users = _userUseCase.GetAllUsers();

            // Если пользователей нет, выводим сообщение и завершаем выполнение метода.
            if (!users.Any())
            {
                Console.WriteLine("Нет пользователей.");
                return;
            }

            // Формируем и выводим список пользователей.
            Console.WriteLine("\n=== Список пользователей ===");
            foreach (var user in users)
            {
                Console.WriteLine($"{user.Guid}\t{user.FIO}\t{user.Group.Name}");
            }
            Console.WriteLine("=============================\n");
        }

        // Метод для поиска пользователя по Guid.
        public void FindUserByGuid(Guid userGuid)
        {
            try
            {
                // Ищем пользователя по указанному Guid.
                var user = _userUseCase.FindUserByGuid(userGuid);

                // Если пользователь найден, выводим его данные.
                Console.WriteLine($"\nПользователь найден: {user.Guid}, {user.FIO}, {user.Group.Name}\n");
            }
            catch (Exception ex)
            {
                // Если возникла ошибка, выводим сообщение об ошибке.
                Console.WriteLine($"Ошибка: {ex.Message}\n");
            }
        }

        // Метод для удаления пользователя по Guid.
        public void RemoveUserByGuid(Guid userGuid)
        {
            // Удаляем пользователя и выводим результат операции.
            Console.WriteLine(_userUseCase.RemoveUserByGuid(userGuid)
                ? "Пользователь удален."
                : "Пользователь не найден.");
        }

        // Метод для обновления данных пользователя по Guid.
        public void UpdateUserByGuid(Guid userGuid)
        {
            try
            {
                // Ищем пользователя по указанному Guid.
                var user = _userUseCase.FindUserByGuid(userGuid);

                // Выводим текущие данные пользователя.
                Console.WriteLine($"\nТекущие данные: {user.FIO}, {user.Group.Name}");

                // Запрашиваем новое ФИО у пользователя.
                Console.Write("Введите новое ФИО: ");
                string newFIO = Console.ReadLine();

                // Проверяем, что новое ФИО не пустое.
                if (string.IsNullOrWhiteSpace(newFIO))
                {
                    Console.WriteLine("ФИО не может быть пустым.");
                    return;
                }

                // Обновляем данные пользователя.
                user.FIO = newFIO;
                _userUseCase.UpdateUser(user);
                Console.WriteLine("Пользователь обновлен.\n");
            }
            catch (Exception ex)
            {
                // Если возникла ошибка, выводим сообщение об ошибке.
                Console.WriteLine($"Ошибка: {ex.Message}\n");
            }
        }

        // Метод для проверки существования группы по ID.
        private GroupLocalEntity ValidateGroupExistence(int groupId)
        {
            // Ищем группу с указанным ID среди всех пользователей.
            var group = _userUseCase.GetAllUsers()
                .Select(u => u.Group)
                .FirstOrDefault(g => g.Id == groupId);

            // Если группа не найдена, выбрасываем исключение.
            if (group == null)
            {
                throw new Exception("Группа не найдена.");
            }

            // Возвращаем найденную группу как локальную сущность.
            return new GroupLocalEntity { Id = group.Id, Name = group.Name };
        }
    }
}
