import { Code, Event, Severity } from "@clarity-types/data";
import { LogData } from "@clarity-types/diagnostic";
import encode from "./encode";

let history: { [key: number]: string[] } = {};
export let data: LogData;

export function start(): void {
    history = {};
}

export function log(code: Code, severity: Severity, name: string = null, message: string = null, stack: string = null): void {
    let key = name ? `${name}|${message}`: "";
    // While rare, it's possible for code to fail repeatedly during the lifetime of the same page
    // In those cases, we only want to log the failure once and not spam logs with redundant information.
    if (code in history && history[code].indexOf(key) >= 0) { return; }

    data = { code, name, message, stack, severity };

    // Maintain history of errors in memory to avoid sending redundant information
    if (code in history) { history[code].push(key); } else { history[code] = [key]; }

    encode(Event.Log);
}

export function stop(): void {
    history = {};
}
