using Demo.Domain.UseCase; using DynamicData; using DynamicData.Binding; using Presence.Desktop.Models; using ReactiveUI; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reactive; using System.Reactive.Linq; using Tmds.DBus.Protocol; namespace Presence.Desktop.ViewModels { public class GroupViewModel : ViewModelBase, IRoutableViewModel { private readonly List _groupPresentersDataSource = new List(); private ObservableCollection _groups; public ObservableCollection Groups => _groups; private GroupPresenter? _selectedGroupItem; public ObservableCollection Users { get => _users;} public ObservableCollection _users; private ObservableCollection _secondComboBoxItems = new ObservableCollection { "no sort", "name sort", "name sort rev" }; public ObservableCollection SecondComboBoxItems => _secondComboBoxItems; private string? _selectedSecondItem; public ReactiveCommand ButtonRemoveUsersByGroup {get; } // public ReactiveCommand ButtonAddUser { get; } public GroupPresenter? SelectedGroupItem { get => _selectedGroupItem; set => this.RaiseAndSetIfChanged(ref _selectedGroupItem, value); } public string? SelectedSecondItem { get => _selectedSecondItem; set => this.RaiseAndSetIfChanged(ref _selectedSecondItem, value); } public GroupViewModel(IGroupUseCase groupUseCase, IUserUseCase userUseCase) { foreach (var item in groupUseCase.GetAllGroupsWithUsers()) { GroupPresenter groupPresenter = new GroupPresenter { Id = item.ID, Name = item.Name, users = item.Users?.Select(user => new UserPresenter { Name = user.FIO, Guid = user.Guid, Group = new GroupPresenter { Id = item.ID, Name = item.Name } } ).ToList() }; _groupPresentersDataSource.Add(groupPresenter); } _groups = new ObservableCollection(_groupPresentersDataSource); _users = new ObservableCollection(); this.WhenAnyValue(vm => vm.SelectedGroupItem) .Subscribe(_ => SetUsers()); this.WhenAnyValue(vm => vm.SelectedSecondItem) .Subscribe(_ => SetUsers()); SelectedSecondItem = _secondComboBoxItems.First(); ButtonRemoveUsersByGroup = ReactiveCommand.Create(() => RemoveUsersByGroup(groupUseCase)); } private void SetUsers() { if(SelectedGroupItem == null) return; if (SelectedGroupItem.users == null) return; var sortedUsers = SelectedSecondItem switch { "name sort" => SelectedGroupItem.users.OrderBy(user => user.Name), "name sort rev" => SelectedGroupItem.users.OrderByDescending(user => user.Name), _ => SelectedGroupItem.users }; Users.Clear(); foreach (var item in sortedUsers) { Users.Add(item); } } private void RemoveUsersByGroup(IGroupUseCase groupUseCase) { if (_selectedGroupItem != null){ groupUseCase.RemoveUsersByGroup(_selectedGroupItem.Id); } var usersToRemove = Users.Where(user => user.Group.Id == _selectedGroupItem.Id).ToList(); foreach (var user in usersToRemove) { Users.Remove(user); } } public string? UrlPathSegment { get; } public IScreen HostScreen { get; } } }