/*
 * Copyright 2017-present Open Networking Foundation
 *
 * 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());
    }
}
