import { Check, Event, Dimension, DimensionData, Setting } from "@clarity-types/data";
import * as limit from "@src/data/limit";
import encode from "./encode";

export let data: DimensionData = null;
export let updates: DimensionData = null;
let limited = false;

export function start(): void {
    data = {};
    updates = {};
    limited = false;
}

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

export function log(dimension: Dimension, value: string): void {
    // Check valid value before moving ahead
    if (value) {
        // Ensure received value is casted into a string if it wasn't a string to begin with
        value = "" + value;
        if (!(dimension in data)) { data[dimension] = []; }
        if (!data[dimension].includes(value)) {
            // Limit check to ensure we have a cap on number of dimensions we can collect
            if (data[dimension].length > Setting.CollectionLimit) {
                if (!limited) {
                    limited = true;
                    limit.trigger(Check.Collection);
                }
                return;
            }

            data[dimension].push(value);
            // If this is a new value, track it as part of updates object
            // This allows us to only send back new values in subsequent payloads
            if (!(dimension in updates)) { updates[dimension] = []; }
            updates[dimension].push(value);
        }
    }
}

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

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