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

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

import org.onosproject.net.PortNumber;

/**
 * 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 PolicyGroupIdentifier 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,
                                    PolicyGroupIdentifier 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 PolicyGroupIdentifier outGroup() {
        return this.outGroup;
    }
}

