/*
 * 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.
     *
     * @return connect point
     */
    public ConnectPoint connectPoint() {
        return cp;
    }

    /**
     * Returns total load of connect point.
     *
     * @return total load
     */
    public Load totalLoad() {
        return totalLoad;
    }

    /**
     * Returns immediate load of connect point.
     *
     * @return immediate load
     */
    public Load immediateLoad() {
        return immediateLoad;
    }

    /**
     * Returns short load of connect point.
     *
     * @return short load
     */
    public Load shortLoad() {
        return shortLoad;
    }

    /**
     * Returns mid load of connect point.
     *
     * @return mid load
     */
    public Load midLoad() {
        return midLoad;
    }

    /**
     * Returns long load of connect point.
     *
     * @return long load
     */
    public Load longLoad() {
        return longLoad;
    }

    /**
     * Returns unknown load of connect point.
     *
     * @return unknown load
     */
    public Load unknownLoad() {
        return unknownLoad;
    }
}
