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

    /**
     * Returns the resource name of this database.
     *
     * @return resource name
     */
    String resourceName();

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

        /**
         * Sets the resource name.
         *
         * @param resourceName resource name
         * @return builder object
         */
        Builder withResourceName(String resourceName);

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