/*
 * 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.net.statistic;

import org.onosproject.net.ConnectPoint;

/**
 * Summary Load classified by flow live type.
 */
public class SummaryFlowEntryWithLoad {
    private ConnectPoint cp;
    private Load totalLoad;
    private Load immediateLoad;
    private Load shortLoad;
    private Load midLoad;
    private Load longLoad;
    private Load unknownLoad;

    /**
     * Creates a new summary flow entry having load for the given connect point and total load.
     *
     * @param cp        connect point
     * @param totalLoad total load
     */
    public SummaryFlowEntryWithLoad(ConnectPoint cp, Load totalLoad) {
        this.cp = cp;
        this.totalLoad = totalLoad;
        this.immediateLoad = new DefaultLoad();
        this.shortLoad = new DefaultLoad();
        this.midLoad = new DefaultLoad();
        this.longLoad = new DefaultLoad();
        this.unknownLoad = new DefaultLoad();
    }

    /**
     * Creates a new summary flow entry having load for the given connect point
     * and total, immediate, short, mid, and long load.
     *
     * @param cp        connect point
     * @param totalLoad total load
     * @param immediateLoad immediate load
     * @param shortLoad short load
     * @param midLoad mid load
     * @param longLoad long load
     */
    public SummaryFlowEntryWithLoad(ConnectPoint cp,
                                    Load totalLoad, Load immediateLoad, Load shortLoad, Load midLoad, Load longLoad) {
        this.cp = cp;
        this.totalLoad = totalLoad;
        this.immediateLoad = immediateLoad;
        this.shortLoad = shortLoad;
        this.midLoad = midLoad;
        this.longLoad = longLoad;
        this.unknownLoad = new DefaultLoad();
    }

    /**
     * Creates a new summary flow entry having load for the given connect point
     * and total, immediate, short, mid, long, and unknown load.
     *
     * @param cp        connect point
     * @param totalLoad total load
     * @param immediateLoad immediate load
     * @param shortLoad short load
     * @param midLoad mid load
     * @param longLoad long load
     * @param unknownLoad long load
     */
    public SummaryFlowEntryWithLoad(ConnectPoint cp,
                                    Load totalLoad, Load immediateLoad,
                                    Load shortLoad, Load midLoad, Load longLoad, Load unknownLoad) {
        this.cp = cp;
        this.totalLoad = totalLoad;
        this.immediateLoad = immediateLoad;
        this.shortLoad = shortLoad;
        this.midLoad = midLoad;
        this.longLoad = longLoad;
        this.unknownLoad = unknownLoad;
    }

    /**
     * Returns connect point.
     */
    public ConnectPoint connectPoint() {
        return cp;
    }

    /**
     * Returns total load of connect point.
     */
    public Load totalLoad() {
        return totalLoad;
    }

    /**
     * Returns immediate load of connect point.
     */
    public Load immediateLoad() {
        return immediateLoad;
    }

    /**
     * Returns short load of connect point.
     */
    public Load shortLoad() {
        return shortLoad;
    }

    /**
     * Returns mid load of connect point.
     */
    public Load midLoad() {
        return midLoad;
    }

    /**
     * Returns long load of connect point.
     */
    public Load longLoad() {
        return longLoad;
    }

    /**
     * Returns unknown load of connect point.
     */
    public Load unknownLoad() {
        return unknownLoad;
    }
}
