import { Event, Metric, type 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 = {};
}

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

export function sum(metric: Metric, value: number): void {
    if (value !== null) {
        if (!(metric in data)) {
            data[metric] = 0;
        }
        if (!(metric in updates)) {
            updates[metric] = 0;
        }
        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 && Number.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 = {};
}
