/*
 * Copyright 2017-2023 Open Networking Foundation (ONF) and the ONF Contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.opencord.igmpproxy.impl.store.groupmember;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import org.onosproject.store.AbstractStore;
import org.opencord.igmpproxy.GroupMemberId;

import java.util.Collection;
import java.util.Map;
import java.util.Set;

/**
 * Abstract implementation of group-member store.
 */
public abstract class AbstractGroupMemberStore extends AbstractStore<GroupMemberEvent, GroupMemberStoreDelegate>
        implements GroupMemberStore {

    protected Map<GroupMemberId, GroupMember> groupMemberMap;

    protected AbstractGroupMemberStore() {

    }

    protected AbstractGroupMemberStore(Map<GroupMemberId, GroupMember> groupMemberMap) {
        this.groupMemberMap = groupMemberMap;
    }

    @Override
    public GroupMember putGroupMember(GroupMember groupMember) {
        return groupMemberMap.put(groupMember.getGroupMemberId(), groupMember);
    }

    @Override
    public GroupMember updateGroupMember(GroupMember groupMember) {
        return groupMemberMap.replace(groupMember.getGroupMemberId(), groupMember);
    }

    @Override
    public GroupMember removeGroupMember(GroupMemberId groupMemberId) {
        return groupMemberMap.remove(groupMemberId);
    }

    @Override
    public GroupMember getGroupMember(GroupMemberId groupMemberId) {
        return groupMemberMap.getOrDefault(groupMemberId, null);
    }

    @Override
    public Set<GroupMemberId> getAllGroupMemberIds() {
        return ImmutableSet.copyOf(groupMemberMap.keySet());
    }

    @Override
    public Collection<GroupMember> getAllGroupMembers() {
        return ImmutableList.copyOf(groupMemberMap.values());
    }
}
