/*
 * Copyright 2014-present 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;
import org.onosproject.net.flow.FlowEntry;
import org.onosproject.net.flow.StoredFlowEntry;

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

/**
 * Load of flow entry with flow live type.
 */
public class FlowEntryWithLoad {
    private final ConnectPoint cp;
    private final FlowEntry fe;
    private final Load load;

    /**
     * Creates a new flow entry with load.
     *
     * @param cp connect point
     * @param fe flow entry with live type
     * @param load load
     */
    public FlowEntryWithLoad(ConnectPoint cp, FlowEntry fe, Load load) {
        checkArgument(fe instanceof StoredFlowEntry, "FlowEntry must be StoredFlowEntry class type");
        this.cp = cp;
        this.fe = fe;
        this.load = load;
    }

    /**
     * Creates a new flow entry with load.
     *
     * @param cp connect point
     * @param fe flow entry with live type
     */
    public FlowEntryWithLoad(ConnectPoint cp, FlowEntry fe) {
        checkArgument(fe instanceof StoredFlowEntry, "FlowEntry must be StoredFlowEntry class type");
        this.cp = cp;
        this.fe = fe;
        this.load = new DefaultLoad(fe.bytes(), 0, typedPollInterval(fe));
    }

    /**
     * Returns connect point.
     *
     * @return connect point
     */
    public ConnectPoint connectPoint() {
        return cp;
    }

    /**
     * Returns stored flow entry.
     *
     * @return flow entry
     */
    public StoredFlowEntry storedFlowEntry() {
        return (StoredFlowEntry) fe;
    }

    /**
     * Returns current load.
     *
     * @return load
     */
    public Load load() {
        return load;
    }

    /**
     * Returns current flow entry's polling interval.
     *
     * @param fe flow entry
     * @return poll interval time unit in seconds
     */
    private long typedPollInterval(FlowEntry fe) {
        checkNotNull(fe, "FlowEntry cannot be null");

        PollInterval pollIntervalInstance = PollInterval.getInstance();

        switch (fe.liveType()) {
            case LONG:
                return pollIntervalInstance.getLongPollInterval();
            case MID:
                return pollIntervalInstance.getMidPollInterval();
            case SHORT:
            case IMMEDIATE:
            case UNKNOWN:
            default:
                return pollIntervalInstance.getPollInterval();
        }
    }
}
