/*
 * 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.codec.impl;

import com.codahale.metrics.Counter;
import com.codahale.metrics.Meter;
import com.codahale.metrics.Metric;
import com.codahale.metrics.Timer;
import com.fasterxml.jackson.databind.JsonNode;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeDiagnosingMatcher;

import java.util.concurrent.TimeUnit;

/**
 * Hamcrest matcher for metrics.
 */
public final class MetricJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {

    private final Metric metric;

    private MetricJsonMatcher(Metric metric) {
        this.metric = metric;
    }

    @Override
    protected boolean matchesSafely(JsonNode jsonMetric, Description description) {

        // check counter
        if (metric instanceof Counter) {
            Counter counter = (Counter) metric;
            long jsonCounter = jsonMetric.get("counter").asLong();
            long counterVal = counter.getCount();
            if (jsonCounter != counterVal) {
                description.appendText("counter was " + jsonCounter);
                return false;
            }
        }

        // check meter
        if (metric instanceof Meter) {
            Meter meter = (Meter) metric;

            long jsonCounter = jsonMetric.get("counter").asLong();
            long counterVal = meter.getCount();
            if (jsonCounter != counterVal) {
                description.appendText("counter was " + jsonCounter);
                return false;
            }

            double jsonOneMinRate = jsonMetric.get("1_min_rate").asDouble();
            double oneMinRate = meter.getOneMinuteRate();
            if (jsonOneMinRate != oneMinRate) {
                description.appendText("one minute rate was " + jsonOneMinRate);
                return false;
            }

            double jsonFiveMinRate = jsonMetric.get("5_min_rate").asDouble();
            double fiveMinRate = meter.getFiveMinuteRate();
            if (jsonFiveMinRate != fiveMinRate) {
                description.appendText("five minute rate was " + jsonFiveMinRate);
                return false;
            }

            double jsonFiftMinRate = jsonMetric.get("15_min_rate").asDouble();
            double fiftMinRate = meter.getFifteenMinuteRate();
            if (jsonFiftMinRate != fiftMinRate) {
                description.appendText("fifteen minute rate was " + jsonFiftMinRate);
                return false;
            }
        }

        // check timer
        if (metric instanceof Timer) {
            Timer timer = (Timer) metric;

            long jsonCounter = jsonMetric.get("counter").asLong();
            long counterVal = timer.getCount();
            if (jsonCounter != counterVal) {
                description.appendText("counter was " + jsonCounter);
                return false;
            }

            double jsonOneMinRate = jsonMetric.get("1_min_rate").asDouble();
            double oneMinRate = timer.getOneMinuteRate();
            if (jsonOneMinRate != oneMinRate) {
                description.appendText("one minute rate was " + jsonOneMinRate);
                return false;
            }

            double jsonFiveMinRate = jsonMetric.get("5_min_rate").asDouble();
            double fiveMinRate = timer.getFiveMinuteRate();
            if (jsonFiveMinRate != fiveMinRate) {
                description.appendText("five minute rate was " + jsonFiveMinRate);
                return false;
            }

            double jsonFiftMinRate = jsonMetric.get("15_min_rate").asDouble();
            double fiftMinRate = timer.getFifteenMinuteRate();
            if (jsonFiftMinRate != fiftMinRate) {
                description.appendText("fifteen minute rate was " + jsonFiftMinRate);
                return false;
            }

            double jsonMean = jsonMetric.get("mean").asDouble();
            double mean = nanoToMs(timer.getSnapshot().getMean());
            if (jsonMean != mean) {
                description.appendText("mean was " + jsonMean);
                return false;
            }

            double jsonMin = jsonMetric.get("min").asDouble();
            double min = nanoToMs(timer.getSnapshot().getMin());
            if (jsonMin != min) {
                description.appendText("json min was " + jsonMin);
                return false;
            }

            double jsonMax = jsonMetric.get("max").asDouble();
            double max = nanoToMs(timer.getSnapshot().getMax());
            if (jsonMax != max) {
                description.appendText("max was " + jsonMax);
                return false;
            }

            double jsonStdDev = jsonMetric.get("stddev").asDouble();
            double stdDev = nanoToMs(timer.getSnapshot().getStdDev());
            if (jsonStdDev != stdDev) {
                description.appendText("stddev was " + jsonStdDev);
                return false;
            }
        }

        return true;
    }

    @Override
    public void describeTo(Description description) {
        description.appendText(metric.toString());
    }

    /**
     * Factory to allocate a metric matcher.
     *
     * @param metric metric object we are looking for
     * @return matcher
     */
    public static MetricJsonMatcher matchesMetric(Metric metric) {
        return new MetricJsonMatcher(metric);
    }

    private double nanoToMs(double nano) {
        return TimeUnit.MILLISECONDS.convert((long) nano, TimeUnit.NANOSECONDS);
    }
}