import { ErrorData } from '@/utils/error-report/ErrorData';
import { SerializedError } from '@reduxjs/toolkit';
// eslint-disable-next-line import/no-cycle
import { store } from '@/redux/store';
import { ONE_THOUSAND } from '@/constants/common';

export const createErrorData = (error: Error | SerializedError | undefined): ErrorData => {
  let stacktrace = '';
  if (error !== undefined) {
    stacktrace = error.stack !== undefined ? error.stack : '';
  }

  let { login } = store.getState().user;
  if (!login) {
    login = 'anonymous';
  }

  const { userData } = store.getState().user;
  let email = null;
  if (userData) {
    email = userData.email;
  }
  const configuration = store.getState().configuration.main.data;
  const version = configuration ? configuration.version : null;

  return {
    url: window.location.href,
    login,
    browser: navigator.userAgent,
    comment: null,
    email,
    javaStacktrace: null, // TODO
    stacktrace,
    timestamp: Math.floor(+new Date() / ONE_THOUSAND),
    version,
  };
};

export const handleError = (error: Error | SerializedError | undefined): void => {
  const errorData = createErrorData(error);
  // eslint-disable-next-line no-console
  console.log(errorData);
};

export const initializeErrorReporting = (): void => {
  if (typeof window !== 'undefined') {
    window.onerror = (msg, url, lineNo, columnNo, error): boolean => {
      handleError(error);
      return true;
    };
  }
};