import { BrowserOptions, ErrorHandlerOptions, browserTracingIntegration } from '@sentry/angular';
import { Integration } from '@sentry/core';
import { Provider, EnvironmentProviders, InjectionToken } from '@angular/core';
import { BaseUser } from '@igo2/core/user';

type MonitoringProvider = 'sentry';
interface MonitoringOptions {
    provider: MonitoringProvider;
    /** Add the user info(id, name, email) to the event request */
    identifyUser?: boolean;
    logErrors?: boolean;
}

type SentryMonitoringOptions = Omit<BrowserOptions, 'integrations'> & MonitoringOptions & {
    provider: 'sentry';
    errorHandlerOptions?: ErrorHandlerOptions;
    integrations?: Integration[];
};

declare const provideSentryMonitoring: (options: SentryMonitoringOptions, integrations?: SentryIntegrationFactory<SentryIntegrationKind>[]) => (Provider | EnvironmentProviders)[];
interface SentryIntegration<KindT extends SentryIntegrationKind> {
    kind: KindT;
    providers: (Provider | EnvironmentProviders)[];
}
type SentryIntegrationFactory<KindT extends SentryIntegrationKind> = (sentryOptions: SentryMonitoringOptions) => SentryIntegration<KindT>;
declare enum SentryIntegrationKind {
    Tracing = 0,
    Replay = 1
}
declare function withTracingIntegration(options: Parameters<typeof browserTracingIntegration>[0]): SentryIntegrationFactory<SentryIntegrationKind.Tracing>;

declare const identifySentryUser: (user: BaseUser | null) => void;

type AnyMonitoringOptions = SentryMonitoringOptions;

declare const MONITORING_OPTIONS: InjectionToken<MonitoringOptions>;

declare const MOCK_SENTRY_OPTIONS: SentryMonitoringOptions;
declare const MOCK_MONITORING_OPTIONS: AnyMonitoringOptions;

export { MOCK_MONITORING_OPTIONS, MOCK_SENTRY_OPTIONS, MONITORING_OPTIONS, SentryIntegrationKind, identifySentryUser, provideSentryMonitoring, withTracingIntegration };
export type { AnyMonitoringOptions, MonitoringOptions, MonitoringProvider, SentryIntegration, SentryMonitoringOptions };
