using data.Exception;
using data.LocalData;
using data.RemoteData.DAO;
using data.Repository;
using domain.Models;
using System.Collections.Generic;
using System.Linq;

// Реализация репозитория для работы с группами.
public class GroupRepositoryImpl : IGroupRepository
{
    // Локальный список групп, загружаемый из статических данных.
    private List<GroupLocalEntity> _groups = LocalStaticData.groups;

    // Метод для получения группы по идентификатору.
    public GroupLocalEntity? GetGroupById(int groupId)
    {
        // Возвращает группу с указанным идентификатором или null, если такая группа не найдена.
        return _groups.FirstOrDefault(g => g.Id == groupId);
    }

    // Метод для получения всех групп.
    public List<GroupLocalEntity> GetAllGroup() => _groups;

    // Метод для добавления новой группы.
    public bool AddGroup(GroupLocalEntity group)
    {
        // Проверяет, существует ли уже группа с таким идентификатором.
        if (_groups.Any(g => g.Id == group.Id))
            return false;  // Возвращает false, если группа уже существует.

        // Устанавливает новый идентификатор для группы.
        group.Id = _groups.Any() ? _groups.Max(g => g.Id) + 1 : 1;

        // Добавляет группу в список.
        _groups.Add(group);
        return true; // Возвращает true, если группа успешно добавлена.
    }

    // Метод для обновления существующей группы.
    public bool UpdateGroupById(int groupID, GroupLocalEntity updatedGroup)
    {
        // Ищет существующую группу по ID.
        var existingGroup = GetGroupById(groupID);
        if (existingGroup == null)
            return false; // Возвращает false, если группа не найдена.

        // Обновляет название группы.
        existingGroup.Name = updatedGroup.Name;
        return true; // Возвращает true, если обновление успешно.
    }

    // Метод для удаления группы по ID.
    public bool RemoveGroupById(int groupID)
    {
        // Ищет существующую группу по ID.
        var existingGroup = GetGroupById(groupID);
        if (existingGroup == null)
            return false; // Возвращает false, если группа не найдена.

        // Удаляет найденную группу из списка.
        _groups.Remove(existingGroup);
        return true; // Возвращает true, если удаление успешно.
    }
}
