import { Event, Metric, MetricData } from "@clarity-types/data";
import encode from "./encode";

export let data: MetricData = null;
export let updates: MetricData = null;

export function start(): void {
    data = {};
    updates = {};
    count(Metric.InvokeCount);
}

export function stop(): void {
    data = {};
    updates = {};
}

function init(metric: Metric): void {
    if (!(metric in data)) { data[metric] = 0; }
    if (!(metric in updates)) { updates[metric] = 0; }
}

export function count(metric: Metric): void {
    init(metric);
    data[metric]++;
    updates[metric]++;
}

export function sum(metric: Metric, value: number): void {
    if (value !== null) { 
        init(metric);
        data[metric] += value;
        updates[metric] += value;
    }
}

export function max(metric: Metric, value: number): void {
    // Ensure that we do not process null or NaN values
    if (value !== null && isNaN(value) === false) { 
        if (!(metric in data)) { data[metric] = 0; }
        if (value > data[metric] || data[metric] === 0) {
            updates[metric] = value;
            data[metric] = value;
        }
    }
}

export function compute(): void {
    encode(Event.Metric);
}

export function reset(): void {
    updates = {};
}
