import React, { useEffect } from 'react';
import * as Sentry from '@sentry/browser';
import { AUTH_ERROR_CODES } from '@theorchard/suite-auth';
import Datadog from '../../datadog';
import { FatalErrorPage } from '../../pages/fatalErrorPage';
import Segment from '../../segment';
import { SuiteErrorCategory } from '../../types';
import { getErrorCode } from '../../utils';
import type { SuiteWrapperProps } from '../../types';

export function FatalErrorHandler<AppData>({ error, data, children }: SuiteWrapperProps<AppData>) {
    useEffect(() => {
        if (!error) return;

        if (error.identity) {
            Sentry.setUser(error.identity);
            Datadog.setUser(error.identity);
            void Segment.setUser(error.identity);
        }

        const code = getErrorCode(error);

        Sentry.captureException(error, {
            extra: { code },
            level: error.category === SuiteErrorCategory.Fatal ? 'fatal' : 'error',
        });

        Datadog.addError(error, { code });

        if (error.category === SuiteErrorCategory.Fatal) {
            let errTitle = 'Fatal Error';
            if (code === AUTH_ERROR_CODES.INVITATION_INVALID) errTitle = 'Invalid Invitation';
            if (code === AUTH_ERROR_CODES.INVITATION_EXPIRED) errTitle = 'Expired Invitation';

            void Segment.trackEvent(errTitle, {
                ...error,
                code,
            });
        }
    }, [error]);

    if (!error || error.category !== SuiteErrorCategory.Fatal) return <>{children}</>;

    return <FatalErrorPage error={error} authClient={data.authClient} config={data.config} />;
}
