private void ExecuteRemoveEquipmentItemFromRoom()
        {
            var typeToRemove = AddedEquipmentTypes.FirstOrDefault(et => et.Name == CurrentlySelectedEquipmentTypeInRoom.EquipmentType.Name);

            if (typeToRemove != null)
            {
                AddedEquipmentTypes.Remove(typeToRemove);
            }

            RemovedEquipmentTypes.Add(CurrentlySelectedEquipmentTypeInRoom.EquipmentType);
            EquipmentTypesInRoom.First(et => et.Name == CurrentlySelectedEquipmentTypeInRoom.EquipmentType.Name).Amount--;

            // The type is not present in the room
            if (FreeEquipmentTypes.FirstOrDefault(et => et.Name == CurrentlySelectedEquipmentTypeInRoom.EquipmentType.Name) == null)
            {
                FreeEquipmentTypes.Insert(0, new EquipmentTypeBindableViewModel(CurrentlySelectedEquipmentTypeInRoom.EquipmentType, 1));
            }
            // The type is present in the room
            else
            {
                FreeEquipmentTypes.First(et => et.Name == CurrentlySelectedEquipmentTypeInRoom.EquipmentType.Name).Amount++;
            }

            // If the free items have been exhausted for the selected type
            if (EquipmentTypesInRoom.First(et => et.Name == CurrentlySelectedEquipmentTypeInRoom.EquipmentType.Name).Amount == 0)
            {
                EquipmentTypesInRoom.Remove(EquipmentTypesInRoom.First(et => et.Name == CurrentlySelectedEquipmentTypeInRoom.EquipmentType.Name));
                CurrentlySelectedEquipmentTypeInRoom = null;
            }
        }
 public async void Initialize()
 {
     RenovationEndDate   = RenovationStartDate = null;
     RenovationStartTime = RenovationEndTime = null;
     SplittingRoom       = false;
     OtherRenovations    = false;
     AddedEquipmentTypes.Clear();
     RemovedEquipmentTypes.Clear();
     EquipmentTypesInRoom.Clear();
     FreeEquipmentTypes.Clear();
     await LoadRooms();
 }
 // Used by Fody weaver
 private void OnCurrentlySelectedRoomChanged()
 {
     if (CurrentlySelectedRoom is null)
     {
         return;
     }
     RoomTypes = new ObservableCollection <RoomType>(Enum.GetValues(typeof(RoomType)).Cast <RoomType>().ToList());
     RoomTypes.Remove(RoomTypes.First(rt => rt == CurrentlySelectedRoom.Type));
     LoadCurrentCalendarWeekForRoom();
     ExecuteLoadRoomsAvailableToJoinTo();
     AddedEquipmentTypes.Clear();
     RemovedEquipmentTypes.Clear();
     LoadFreeEquipmentTypes();
     LoadRoomEquipmentTypes();
 }
        private async Task <List <EquipmentItem> > AddedEquipmentItems()
        {
            var countByAddedEquipmentType = AddedEquipmentTypes
                                            .GroupBy(x => x)
                                            .Select(g => new { Value = g.Key, Count = g.Count() })
                                            .OrderByDescending(x => x.Count)
                                            .ToList();

            var addedItems = new List <EquipmentItem>();

            foreach (var pair in countByAddedEquipmentType)
            {
                var itemsToAdd = (await _equipmentItemService.GetAllFreeByType(pair.Value)).Take(pair.Count).ToList();
                addedItems.AddRange(itemsToAdd);
            }
            return(addedItems);
        }
        private async void ExecuteScheduleRenovation()
        {
            RoomAlreadyInUse = InvalidTimeFrame = false;
            var renovationStartPeriod = RenovationStartDate + RenovationStartTime?.TimeOfDay;
            var renovationEndPeriod   = RenovationEndDate + RenovationEndTime?.TimeOfDay;

            if (renovationEndPeriod <= renovationStartPeriod || renovationStartPeriod == null || renovationEndPeriod == null)
            {
                InvalidTimeFrame = true;
                return;
            }

            // Trying to save some RAM
            if ((await _calendarEntryService.GetAllByRoomAndTimeFrame(CurrentlySelectedRoom.Room, renovationStartPeriod.Value, renovationEndPeriod.Value)).Count != 0)
            {
                RoomAlreadyInUse = true;
                return;
            }

            var addedItems = await AddedEquipmentItems();

            var removedItems = await RemovedEquipmentItems();

            var roomToJoinTo = RoomToJoinTo?.Room;

            await _renovationService.Create(CurrentlySelectedRoom.Room, roomToJoinTo, NewRoomType,
                                            renovationStartPeriod.Value, renovationEndPeriod.Value, SplittingRoom,
                                            removedItems, addedItems);

            if (removedItems.Count > 0)
            {
                foreach (var equipmentItem in removedItems)
                {
                    await _equipmentItemService.Create(equipmentItem.EquipmentType, 1);
                }
            }

            Calendar.AddEvents((await _calendarEntryService.GetAllByRoomAndTimeFrame(CurrentlySelectedRoom.Room, renovationStartPeriod.Value, renovationEndPeriod.Value)).ToList());
            RenovationEndDate = RenovationStartDate = RenovationStartTime = RenovationEndTime = null;
            SplittingRoom     = false;
            OtherRenovations  = false;
            AddedEquipmentTypes.Clear();
            RemovedEquipmentTypes.Clear();
            LoadFreeEquipmentTypes();
            LoadRoomEquipmentTypes();
        }