/*
 * Copyright 2016 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.cpman;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Database for storing a metric.
 */
public interface MetricsDatabase {
    /**
     * Returns the metric name of this database.
     *
     * @return metric name
     */
    String metricName();

    /**
     * Update metric value by specifying metric type.
     *
     * @param metricType    metric type (e.g., load, usage, etc.)
     * @param value         metric value
     */
    void updateMetric(String metricType, double value);

    /**
     * Update metric value by specifying metric type in a certain time.
     *
     * @param metricType    metric type (e.g., load, usage, etc.)
     * @param value         metric value
     * @param time          update time in seconds
     */
    void updateMetric(String metricType, double value, long time);

    /**
     * Update metric values of a collection of metric types.
     *
     * @param metrics       a collection of metrics which consists of a pair of
     *                      metric type and metric value
     * @param time          update time in seconds
     */
    void updateMetrics(Map<String, Double> metrics, long time);

    /**
     * Update metric values of a collection of metric types.
     *
     * @param metrics       a collection of metrics which consists of a pair of
     *                      metric type and metric value
     */
    void updateMetrics(Map<String, Double> metrics);

    /**
     * Returns most recent metric value of a given metric type.
     *
     * @param metricType metric type
     * @return metric value
     */
    double recentMetric(String metricType);

    /**
     * Return most recent metric values of a given metric type for a given period.
     *
     * @param metricType    metric type
     * @param duration      duration
     * @param unit          time unit
     * @return a collection of metric value
     */
    double[] recentMetrics(String metricType, int duration, TimeUnit unit);

    /**
     * Returns minimum metric value of a given metric type.
     *
     * @param metricType    metric type
     * @return metric value
     */
    double minMetric(String metricType);

    /**
     * Returns maximum metric value of a given metric type.
     *
     * @param metricType    metric type
     * @return metric value
     */
    double maxMetric(String metricType);

    /**
     * Returns a collection of metric values of a given metric type for a day.
     *
     * @param metricType    metric type
     * @return a collection of metric value
     */
    double[] metrics(String metricType);

    /**
     * Returns a collection of metric values of a given metric type for
     * a given period.
     *
     * @param metricType    metric type
     * @param startTime     start time
     * @param endTime       end time
     * @return a collection of metric value
     */
    double[] metrics(String metricType, long startTime, long endTime);

    /**
     * Returns the latest metric update time.
     *
     * @param metricType    metric type
     * @return timestamp
     */
    long lastUpdate(String metricType);

    /**
     * A builder of MetricsDatabase.
     */
    interface Builder {

        /**
         * Sets the metric name.
         *
         * @param metricName metric name
         * @return builder object
         */
        Builder withMetricName(String metricName);

        /**
         * Add a new metric to be monitored.
         *
         * @param metricType control metric type
         * @return builder object
         */
        Builder addMetricType(String metricType);

        /**
         * Builds a metric database instance.
         *
         * @return metric database instance
         */
        MetricsDatabase build();
    }
}
