declare module "obsly-sdk-js-full" {
  export function setUserID(userID: string): void;
  export function setPersonID(personID: string): void;
  export function setPassportID(passportID: string): void;
  export function setContractID(contractID: string): void;
  export function setAppName(appName: string): void;
  export function setAppVersion(appVersion: string): void;
  export type LogLevel = "null" | "error" | "warn" | "log" | "debug";
  export function setLogLevel(logLevel: LogLevel): void;
  export function startSession(): void;
  export function closeCurrentSession(): void;
  export function createNewSession(customSessionId: string): void;
  export function pauseTracker(): void;
  export function resumeTracker(): void;
  export function setRequestsBlacklist(blacklist?: string[]): void;
  export type Tag = {
    key: string;
    value: string;
  };
  export function addTag(tags: Tag[], category: string): Promise<void>;
  export function addScreenshot(): void;
  export function addObslyTag(tags: Tag[], category: string): Promise<void>;
  export function addObslyScreenshot(): void;
  export function startTransaction(
    name: string,
    description?: string,
    startNanoTime?: number,
    autofinishWithStepsCount?: number
  ): Promise<void>;
  export function endTransaction(
    name: string,
    updatedDescription?: string
  ): Promise<void>;
  export function startStep(
    name: string,
    transactionName: string,
    description?: string,
    startNanoTime?: number
  ): Promise<void>;
  export function finishStep(
    name: string,
    transactionName: string,
    updatedDescription?: string
  ): Promise<void>;
  export type Session = {
    sessionID: string;
    installationID: string;
  };
  export function getSessionInfo(): Promise<Session>;
  export type Base64String = string;
  export function getScreenshot(): Base64String;
  export function addFeedback(
    rating: string,
    message: string,
    image?: Base64String
  ): Promise<void>;
  export function setView(name: string): Promise<void>;
  export function setFunctionalBlock(name: string): Promise<void>;
  export function setOperation(name: string): Promise<void>;
  export function activateFullDebug(): Promise<void>;
  export function deactivateFullDebug(): Promise<void>;

  export function incCounter(
    key: string,
    fbl: string,
    operation: string,
    view: string,
    state: string
  ): Promise<void>;
  export function setGauge(
    key: string,
    value: number,
    fbl: string,
    operation: string,
    view: string,
    state: string
  ): Promise<void>;
  export function startHistogramTimer(
    key: string,
    fbl: string,
    operation: string,
    view: string
  ): Promise<void>;
  export function endHistogramTimer(
    key: string,
    fbl: string,
    operation: string,
    view: string,
    state: string
  ): Promise<void>;

  export interface RageClickConfig {
    active?: boolean;
    screenshot?: boolean;
    screenshotPercent?: number;
  }
  export interface ObslyConfig {
    enableCrashes?: boolean;
    enableLifeCycleLog?: boolean;
    enableRequestLog?: boolean;
    enableTagger?: boolean;
    enablePerformance?: boolean;
    enableUI?: boolean;
    hostBlacklist?: string[] | null;
    hostBodyWhitelist?: string[] | null;
    requestHeadersWhitelist?: string[] | null;
    automaticViewDetection?: boolean;
    rageClick?: RageClickConfig;
    sessionMaxLengthMins?: number;
    keepSessionOnRefresh?: boolean;
    enableScreenshotOnUi?: boolean;
    captureConsole?: boolean;
  }

  export interface InitParameters {
    ObslyKey: string;
    instanceURL: string;
    remoteConfigURL?: string;
    proEnv?: boolean;
    appVersion?: string;
    appName?: string;
    logLevel?: LogLevel;
    config?: ObslyConfig;
    debugMode?: boolean;
    sessionID?: string;
  }

  export function init(parameters: InitParameters): Promise<void>;
}