using Zurnal.Data.Repository;
using Zurnal.Date.Repository;
using Zurnal.RemaDateBase.DateDao;

namespace Zurnal.Domain.UseCase
{
    public class UserUseCase : IGroupRepository
    {
        private readonly UserRepositoryImpl _repositoryUserImpl;
        internal IGroupRepository RepositoryGroupImpl { get; }

        public UserUseCase(UserRepositoryImpl repositoryImpl, GroupRepositoryImpl repositoryGroupImpl)
        {
            _repositoryUserImpl = repositoryImpl;
            RepositoryGroupImpl = (IGroupRepository?)(repositoryGroupImpl ?? throw new ArgumentNullException(nameof(repositoryGroupImpl)));
        }

        public List<UserDao> GetAllUsers() => _repositoryUserImpl.GetAllUsersList()
            .Join(RepositoryGroupImpl.AllGroup,
            user => user.GroupID,
            group => group.Id,
            (user, group) => 
    new UserDao { FIO = user.FIO, 
        UserGuid = user.Guid, 
        Group = new GroupDao { Id = group.Id, GroupName = group.GroupName }, 
        GroupID = group.Id }
    ).ToList();

        public bool RemoveUserByGuid(Guid userGuid) 
        {
            return _repositoryUserImpl.RemoveUserByGuid(userGuid);
        }

        public UserDao UpdateUser(UserDao user, int groupId)
{
    UserLocalEntity userLocalEntity = new UserLocalEntity { FIO = user.FIO, GroupID = groupId, Guid = user.UserGuid };
    UserLocalEntity? result = _repositoryUserImpl.UpdateUser(userLocalEntity);
    if (result == null) throw new Exception("Пользователь не обновлен.");
    GroupDao? group = GetAllGroups().FirstOrDefault(it => it.Id == result.GroupID);
    if (group == null) throw new Exception("Група не нфйдуна.");
    return new UserDao { FIO = user.FIO, UserGuid = user.UserGuid, Group = group, GroupID = group.Id };
}

        public IEnumerable<GroupDao> GetAllGroups()
{
    return RepositoryGroupImpl.AllGroup;
}

        public UserDao FindUserByGuid(Guid userGuid)
{
    var user = _repositoryUserImpl.GetAllUsersList().FirstOrDefault(u => u.Guid == userGuid);
    if (user == null) 
    {
        Console.WriteLine("Пользователь не найден.");
        return null; 
    }
    
    GroupDao group = RepositoryGroupImpl.AllGroup.FirstOrDefault(g => g.Id == user.GroupID);
    if (group == null) 
    {
        Console.WriteLine("Группа не найдена.");
        return null; 
    }
    
    return new UserDao { FIO = user.FIO, UserGuid = user.Guid, Group = group, GroupID = group.Id };
}

        public List<GroupDao> AllGroup => RepositoryGroupImpl.AllGroup.ToList();
        List<GroupDao> IGroupRepository.AllGroup => throw new NotImplementedException();

        IEnumerable<System.Text.RegularExpressions.Group> IGroupRepository.AllGroups()
        {
            return (IEnumerable<System.Text.RegularExpressions.Group>)((IGroupRepository)_repositoryUserImpl).GetAllGroups();
        }
        internal class UserLocalEntity 
        {
            public string FIO { get; set; }
            public int GroupID { get; set; }
            public Guid Guid { get; set; }
        }
    }
}