/*
 * Copyright 2015 Open Networking Laboratory
 *
 * 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.onosproject.grouphandler;

import static com.google.common.base.Preconditions.checkNotNull;

import org.onosproject.net.PortNumber;
import org.onosproject.net.group.GroupKey;

/**
 * Representation of policy group bucket identifier. Not exposed to
 * the application and only to be used internally.
 */
public class GroupBucketIdentifier {
    private int label;
    private BucketOutputType type;
    private PortNumber outPort;
    private GroupKey outGroup;

    protected enum BucketOutputType {
        PORT,
        GROUP
    }

    protected GroupBucketIdentifier(int label,
                                    PortNumber outPort) {
        this.label = label;
        this.type = BucketOutputType.PORT;
        this.outPort = checkNotNull(outPort);
        this.outGroup = null;
    }

    protected GroupBucketIdentifier(int label,
                                    GroupKey outGroup) {
        this.label = label;
        this.type = BucketOutputType.GROUP;
        this.outPort = null;
        this.outGroup = checkNotNull(outGroup);
    }

    protected int label() {
        return this.label;
    }

    protected BucketOutputType type() {
        return this.type;
    }

    protected PortNumber outPort() {
        return this.outPort;
    }

    protected GroupKey outGroup() {
        return this.outGroup;
    }
}

