import type { FrontendErrorContext } from "./types.js";

interface FrontendErrorCollectorGlobal {
  setContext: (context: FrontendErrorContext) => void;
}

declare global {
  interface Window {
    __OPENHANDOFF_FRONTEND_ERROR_COLLECTOR__?: FrontendErrorCollectorGlobal;
    __OPENHANDOFF_FRONTEND_ERROR_CONTEXT__?: FrontendErrorContext;
  }
}

export function setFrontendErrorContext(context: FrontendErrorContext): void {
  if (typeof window === "undefined") {
    return;
  }

  const nextContext = sanitizeContext(context);
  window.__OPENHANDOFF_FRONTEND_ERROR_CONTEXT__ = {
    ...(window.__OPENHANDOFF_FRONTEND_ERROR_CONTEXT__ ?? {}),
    ...nextContext,
  };
  window.__OPENHANDOFF_FRONTEND_ERROR_COLLECTOR__?.setContext(nextContext);
}

function sanitizeContext(input: FrontendErrorContext): FrontendErrorContext {
  const output: FrontendErrorContext = {};
  for (const [key, value] of Object.entries(input)) {
    if (value === null || value === undefined || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
      output[key] = value;
    }
  }
  return output;
}
