/*
 * 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);

    /**
     * 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
         */
        Builder addMetricType(String metricType);

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