// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.base.metrics.test;

import android.util.Pair;

import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;

import org.chromium.base.metrics.RecordHistogram;

import java.util.HashMap;
import java.util.concurrent.TimeUnit;

/**
 * Implementation of RecordHistogram which does not rely on native and still enables testing of
 * histogram counts.
 */
@Implements(RecordHistogram.class)
public class ShadowRecordHistogram {
    private static HashMap<Pair<String, Integer>, Integer> sSamples =
            new HashMap<Pair<String, Integer>, Integer>();

    @Resetter
    public static void reset() {
        sSamples.clear();
    }

    @Implementation
    public static void recordCountHistogram(String name, int sample) {
        Pair<String, Integer> key = Pair.create(name, sample);
        incrementSampleCount(key);
    }

    @Implementation
    public static void recordCount100Histogram(String name, int sample) {
        Pair<String, Integer> key = Pair.create(name, sample);
        incrementSampleCount(key);
    }

    @Implementation
    public static void recordEnumeratedHistogram(String name, int sample, int boundary) {
        assert sample < boundary : "Sample " + sample + " is not within boundary " + boundary + "!";
        incrementSampleCount(Pair.create(name, sample));
    }

    @Implementation
    public static void recordLongTimesHistogram100(String name, long duration, TimeUnit timeUnit) {
        Pair<String, Integer> key = Pair.create(name, (int) timeUnit.toMillis(duration));
        incrementSampleCount(key);
    }

    @Implementation
    public static int getHistogramValueCountForTesting(String name, int sample) {
        Integer i = sSamples.get(Pair.create(name, sample));
        return (i != null) ? i : 0;
    }

    private static void incrementSampleCount(Pair<String, Integer> key) {
        Integer i = sSamples.get(key);
        if (i == null) {
            i = 0;
        }
        sSamples.put(key, i + 1);
    }
}
