using data.Repository;
using domain.Models;
using domain.Models.ResponseModele;

namespace domain.UseCase
{
    // Класс GroupUseCase предоставляет операции для работы с группами.
    public class GroupUseCase
    {
        private readonly IGroupRepository _repositoryGroupImpl; // Репозиторий для работы с группами

        // Конструктор для инициализации репозитория групп.
        public GroupUseCase(IGroupRepository repositoryGroupImpl)
        {
            _repositoryGroupImpl = repositoryGroupImpl;
        }

        // Проверяет существование группы по её ID.
        private GroupLocalEntity ValidateGroupExistence(int groupId)
        {
            var existingGroup = _repositoryGroupImpl.GetAllGroup()
                .FirstOrDefault(g => g.Id == groupId);

            if (existingGroup == null)
            {
                throw new ArgumentException("Группа не найдена.");
            }
            return existingGroup; // Возвращаем найденную группу
        }

        // Получить все группы
        public List<Group> GetAllGroups()
        {
            return _repositoryGroupImpl.GetAllGroup()
                .Select(it => new Group { Id = it.Id, Name = it.Name }) // Преобразуем в DTO-объект
                .ToList();// Список групп
        }

        // Найти группу по ID
        public Group FindGroupById(int groupId)
        {
            return GetAllGroups().FirstOrDefault(g => g.Id == groupId) ?? throw new ArgumentException("Группа не найдена."); // Выбрасываем исключение, если группа не найдена
        }

        // Добавить новую группу
        public void AddGroup(string groupName)
        {
            var newId = _repositoryGroupImpl.GetAllGroup().Any()
                ? _repositoryGroupImpl.GetAllGroup().Max(g => g.Id) + 1 // Генерируем новый ID
                : 1;

            var newGroup = new GroupLocalEntity
            {
                Id = newId,
                Name = groupName
            };
            _repositoryGroupImpl.AddGroup(newGroup); // Добавляем группу в репозиторий
        }

        // Удалить группу по ID
        public void RemoveGroupById(int groupId)
        {
            ValidateGroupExistence(groupId); // Проверяем, существует ли группа
            _repositoryGroupImpl.RemoveGroupById(groupId); // Удаляем группу
        }

        // Изменить название группы
        public bool UpdateGroup(int groupId, string newGroupName)
        {
            var existingGroup = _repositoryGroupImpl.GetAllGroup()
                .FirstOrDefault(g => g.Id == groupId);

            if (existingGroup == null)
            {
                return false; // Если группа не найдена
            }

            existingGroup.Name = newGroupName; // Обновляем название
            _repositoryGroupImpl.UpdateGroupById(existingGroup.Id, existingGroup); // Сохраняем изменения
            return true;// True, если обновление успешно
        }

        public List<GroupResponse> getAllGroup()
        {
            return _repositoryGroupImpl.GetAllGroup().Select(group =>
            new GroupResponse
            {
                Id = group.Id,
                Name = group.Name
            }
            ).ToList();
        }
    }
}
