using Demo.Data.Exceptions;
using Demo.Data.LocalData;
using Demo.Data.RemoteData.RemoteDataBase;
using Demo.Data.RemoteData.RemoteDataBase.DAO;
using Demo.Data.Repository;
using Demo.domain.Models;
using System.Collections.Generic;
using System.Linq;

public class SQLGroupRepositoryImpl : IGroupRepository
{
    private readonly RemoteDatabaseContext _remoteDatabaseContext;

    public SQLGroupRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext)
    {
        _remoteDatabaseContext = remoteDatabaseContext;
    }

    // Метод для получения группы по ID
    public GroupLocalEntity? GetGroupById(int groupId)
    {
        var groupDao = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupId);
        return groupDao != null ? new GroupLocalEntity { Id = groupDao.Id, Name = groupDao.Name } : null;
    }

    // Метод для получения всех групп
    public List<GroupLocalEntity> GetAllGroup()
    {
        return _remoteDatabaseContext.Groups
            .Select(group => new GroupLocalEntity {
                Id = group.Id,
                Name = group.Name 
            }).ToList();
    }

    // Метод для добавления новой группы
    public bool AddGroup(GroupLocalEntity group)
    {
        if (_remoteDatabaseContext.Groups.Any(g => g.Id == group.Id))
            return false;

        var groupDao = new GroupDao { Id = group.Id, Name = group.Name };
        _remoteDatabaseContext.Groups.Add(groupDao);
        _remoteDatabaseContext.SaveChanges();
        return true;
    }

    // Метод для обновления существующей группы
    public bool UpdateGroupById(int groupID, GroupLocalEntity updatedGroup)
    {
        var existingGroup = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupID);
        if (existingGroup == null)
            return false;

        existingGroup.Name = updatedGroup.Name;
        _remoteDatabaseContext.SaveChanges();
        return true;
    }

    // Метод для удаления группы по ID
    public bool RemoveGroupById(int groupID)
    {
        var existingGroup = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupID);
        if (existingGroup == null)
            return false;

        _remoteDatabaseContext.Groups.Remove(existingGroup);
        _remoteDatabaseContext.SaveChanges();
        return true;
    }
}
