import { BooleanFlag, Token, Upload, Envelope, ApplicationPlatform } from "@clarity-types/data";
import { time } from "@src/core/time";
import version from "@src/core/version";
import * as metadata from "@src/data/metadata";
import * as scrub from "@src/core/scrub";

export let data: Envelope = null;

export function start(): void {
  const m = metadata.data;
  data = {
    version,
    sequence: 0,
    start: 0,
    duration: 0,
    projectId: m.projectId,
    userId: m.userId,
    sessionId: m.sessionId,
    pageNum: m.pageNum,
    upload: Upload.Async,
    end: BooleanFlag.False,
    applicationPlatform: ApplicationPlatform.WebApp,
    url: ''
  };
}

export function stop(): void {
    data = null;
}

export function envelope(last: boolean): Token[] {
  data.start = data.start + data.duration;
  data.duration = time() - data.start;
  data.sequence++;
  data.upload = last && "sendBeacon" in navigator ? Upload.Beacon : Upload.Async;
  data.end = last ? BooleanFlag.True : BooleanFlag.False;
  data.applicationPlatform = ApplicationPlatform.WebApp;
  data.url = scrub.url(location.href, false, true);
  return [
    data.version,
    data.sequence,
    data.start,
    data.duration,
    data.projectId,
    data.userId,
    data.sessionId,
    data.pageNum,
    data.upload,
    data.end,
    data.applicationPlatform,
    data.url
  ];
}
