/*
 * 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.incubator.net.tunnel;

import com.google.common.annotations.Beta;

import java.time.Duration;
import java.util.List;

/**
 * Default implementation of immutable tunnel statistics.
 */
@Beta
public final class DefaultTunnelStatistics implements TunnelStatistics {
    private final TunnelId tunnelId;
    private final double bwUtilization;
    private final double packetLossRatio;
    private final Duration flowDelay;
    private final List<String> alarms;

    private DefaultTunnelStatistics(TunnelId tunnelId,
                                    double bwUtilization,
                                    double packetLossRatio,
                                    Duration flowDelay,
                                    List<String> alarms) {
        this.tunnelId = tunnelId;
        this.bwUtilization = bwUtilization;
        this.packetLossRatio = packetLossRatio;
        this.flowDelay = flowDelay;
        this.alarms = alarms;
    }

    private DefaultTunnelStatistics() {
        this.tunnelId = null;
        this.bwUtilization = 0;
        this.packetLossRatio = 0;
        this.flowDelay = null;
        this.alarms = null;
    }


    @Override
    public TunnelId id() {
        return this.tunnelId;
    }

    @Override
    public double bandwidthUtilization() {
        return this.bwUtilization;
    }

    @Override
    public double packetLossRate() {
        return this.packetLossRatio;
    }

    @Override
    public Duration flowDelay() {
        return this.flowDelay;
    }


    @Override
    public List<String> alarms() {
        return this.alarms;
    }

    /**
     * Builder for tunnelStatistics.
     */
    public static final class Builder {
        TunnelId tunnelId;
        double bwUtilization;
        double packetLossRatio;
        Duration flowDelay;
        List<String> alarms;

        public Builder() {

        }

        /**
         * Set tunnel id.
         *
         * @param tunnelId tunnel id
         * @return builder object
         */
        public Builder setTunnelId(TunnelId tunnelId) {
            this.tunnelId = tunnelId;

            return this;
        }

        /**
         * set bandwidth utilization.
         *
         * @param bwUtilization bandwidth utilization
         * @return builder object
         */
        public Builder setBwUtilization(double bwUtilization) {
            this.bwUtilization = bwUtilization;

            return this;
        }

        /**
         * Set packet loss ratio.
         *
         * @param packetLossRatio packet loss ratio
         * @return builder object
         */
        public Builder setPacketLossRatio(double packetLossRatio) {
            this.packetLossRatio = packetLossRatio;

            return this;
        }

        /**
         * Set flow delay.
         *
         * @param flowDelay flow delay
         * @return builder object
         */
        public Builder setFlowDelay(Duration flowDelay) {
            this.flowDelay = flowDelay;

            return this;
        }

        /**
         * Set alarms.
         *
         * @param alarms alarms of a tunnel
         * @return builder object
         */
        public Builder setAlarms(List<String> alarms) {
            this.alarms = alarms;

            return this;
        }

        /**
         * Creates a TunnelStatistics object.
         *
         * @return DefaultTunnelStatistics
         */
        public DefaultTunnelStatistics build() {
            return new DefaultTunnelStatistics(tunnelId,
                                               bwUtilization,
                                               packetLossRatio,
                                               flowDelay,
                                               alarms);
        }
    }
}
