package pl.allegro.tech.hermes.common.metric.counter;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * Small util to calculate delta between previous and current state of metric. It helps in developing incremental metric storage, as Metrics
 * always wants to push current state of Metric, not increment.
 */
public class MetricsDeltaCalculator {

    private final ConcurrentMap<String, Long> previousValues = new ConcurrentHashMap<>();

    public long calculateDelta(String metricName, Long currentValue) {
        Long previousValue = previousValues.put(metricName, currentValue);

        long delta = currentValue;
        if (previousValue != null) {
            delta = currentValue - previousValue;
        }
        return delta;
    }

    public void revertDelta(String metricName, Long delta) {
        Long previousValue = previousValues.get(metricName);
        if (previousValue != null) {
            previousValues.put(metricName, previousValue - delta);
        }
    }

    public void clear() {
        previousValues.clear();
    }
}
