/*
 * 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 java.time.Duration;
import java.util.List;

/**
 * Default implementation of immutable tunnel statistics.
 */
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);
        }
    }
}
