import * as amplitude from '@amplitude/analytics-browser';
import { Types } from '@amplitude/analytics-browser';

interface SessionReplayConfig {
    recordingEndpoints?: string[];
    sampleRate?: number;
}

declare class Braze {
    private static instance;
    private apiKey;
    private baseUrl;
    private enableLogging;
    private allowUserSuppliedJavascript;
    private isInitialized;
    private cookieMonitorInterval;
    private cookieCheckInterval;
    private lastUserId;
    private changeUserHistory;
    private constructor();
    /**
     * Braze 인스턴스를 가져옵니다. (Singleton 패턴)
     * @param apiKey Braze API 키
     * @param baseUrl Braze SDK 엔드포인트
     * @param enableLogging 로깅 활성화 여부
     * @param allowUserSuppliedJavascript 사용자 제공 JavaScript 허용 여부
     * @returns Braze 인스턴스
     */
    static getInstance(apiKey?: string, baseUrl?: string, enableLogging?: boolean, allowUserSuppliedJavascript?: boolean): Braze;
    /**
     * 쿠키에서 user_id를 가져옵니다.
     * @returns user_id 값 또는 null
     */
    private getUserIdFromCookie;
    /**
     * 쿠키 모니터링을 시작합니다.
     */
    private startCookieMonitoring;
    /**
     * 쿠키 모니터링을 중지합니다.
     */
    private stopCookieMonitoring;
    /**
     * 쿠키 모니터링 간격을 설정합니다.
     * @param interval 체크 간격 (밀리초)
     */
    setCookieCheckInterval(interval: number): void;
    /**
     * changeUser 히스토리를 초기화합니다.
     * 로그아웃 후 새로운 사용자로 로그인할 때 사용합니다.
     */
    resetChangeUserHistory(): void;
    /**
     * Braze SDK를 초기화합니다.
     */
    initialize(): void;
    /**
     * 사용자 지정 이벤트를 로깅합니다.
     * @param eventName 이벤트 이름
     * @param brazeProperties 이벤트 속성
     */
    logCustomEvent(eventName: string, brazeProperties: object): void;
    /**
     * 현재 사용자의 외부 ID를 설정합니다.
     * @param userIdentifier 사용자 식별자
     */
    changeUser(userIdentifier: string): void;
    /**
     * 사용자 커스텀 속성을 설정합니다.
     * @param attributeKey 속성 키
     * @param attributeValue 속성 값
     */
    setCustomUserAttribute(attributeKey: string, attributeValue: any): void;
    /**
     * Braze 푸시 알림 권한을 요청합니다.
     * @returns Promise<boolean> 권한 허용 여부
     */
    requestNotificationPermission(): Promise<boolean>;
    /**
     * 초기화 상태를 확인합니다.
     */
    private ensureInitialized;
    /**
     * Braze SDK를 비활성화합니다.
     * 탈퇴 시 사용자 데이터 수집을 중단합니다.
     */
    disableSDK(): void;
    /**
     * Braze SDK를 다시 활성화합니다.
     */
    enableSDK(): void;
    /**
     * Braze 인스턴스를 정리합니다.
     */
    destroy(): void;
    /**
     * Braze의 디바이스 ID를 반환합니다.
     * @returns 디바이스 ID 문자열 또는 undefined
     */
    getDeviceId(): string | undefined;
}

type BrowserOptions = Types.BrowserOptions;

/**
 * Cross Platform Logger를 초기화합니다.
 * @param flounder_key Flounder API 키
 * @param amplitude_key Amplitude API 키
 * @param hackle_key Hackle API 키
 * @param braze_key Braze API 키 (선택사항)
 * @param braze_endpoint Braze SDK 엔드포인트 (선택사항)
 * @param is_dev 개발 환경 여부
 * @param amplitude_browser_options Amplitude 브라우저 옵션
 */
declare const initCPLog: (flounder_key: string, amplitude_key: string, hackle_key: string, braze_key?: string, braze_endpoint?: string, is_dev?: boolean, amplitude_browser_options?: BrowserOptions) => void;
/**
 * 이벤트를 모든 로거 서비스에 전송합니다.
 * @param key 이벤트 키
 * @param data 이벤트 데이터
 * @param is_gtm GTM 전송 여부
 */
declare const sendCPLog: (key: string, data?: {}, is_gtm?: boolean) => void;
/**
 * Amplitude 인스턴스를 반환합니다.
 * @returns Amplitude 인스턴스
 */
declare const getAmplitudeInstance: () => typeof amplitude | null;
/**
 * Amplitude 사용자 속성을 설정합니다.
 * @param key 속성 키
 * @param value 속성 값
 */
declare const setAmplitudeUserProperty: (key: string, value: any) => void;
/**
 * Amplitude 사용자의 여러 속성을 설정합니다.
 * @param properties 사용자 속성 객체
 */
declare const setAmplitudeUserProperties: (properties: Record<string, any>) => void;
/**
 * Amplitude 사용자 속성을 배열에 추가합니다.
 * @param key 배열 속성 키
 * @param value 추가할 값
 */
declare const appendAmplitudeUserProperty: (key: string, value: any) => void;
/**
 * Amplitude 사용자 속성을 배열에서 제거합니다.
 * @param key 배열 속성 키
 * @param value 제거할 값
 */
declare const removeAmplitudeUserProperty: (key: string, value: any) => void;
/**
 * Amplitude 사용자 속성을 제거합니다.
 * @param key 제거할 속성 키
 */
declare const unsetAmplitudeUserProperty: (key: string) => void;
/**
 * Braze 인스턴스를 반환합니다.
 * @returns Braze 인스턴스
 */
declare const getBrazeInstance: () => Braze | null;
/**
 * Braze 인스턴스를 정리합니다.
 */
declare const destroyBrazeInstance: () => void;
/**
 * Braze changeUser 히스토리를 초기화합니다.
 * 로그아웃 후 새로운 사용자로 로그인할 때 사용합니다.
 */
declare const resetBrazeChangeUserHistory: () => void;
/**
 * Braze 웹 푸시 알림 권한을 요청합니다.
 * @returns Promise<boolean> 권한 허용 여부
 */
declare const requestBrazeNotificationPermission: () => Promise<boolean>;
/**
 * Braze SDK를 비활성화합니다.
 * 탈퇴 시 사용자 데이터 수집을 중단합니다.
 */
declare const disableBrazeSDK: () => void;
/**
 * Braze SDK를 다시 활성화합니다.
 */
declare const enableBrazeSDK: () => void;
/**
 * Amplitude Session Replay 설정을 구성합니다.
 * @param config Session Replay 설정
 */
declare const setAmplitudeSessionReplayConfig: (config: SessionReplayConfig) => void;
/**
 * Amplitude Session Replay를 시작합니다.
 */
declare const startAmplitudeSessionReplay: () => void;
/**
 * Amplitude Session Replay를 중지합니다.
 */
declare const stopAmplitudeSessionReplay: () => void;
/**
 * 특정 endpoint에서 Amplitude Session Replay를 시작합니다.
 * @param currentPath 현재 경로
 */
declare const startAmplitudeSessionReplayForEndpoint: (currentPath: string) => void;
/**
 * Amplitude 사용자 ID를 설정합니다.
 * @param userId 사용자 ID
 */
declare const setAmplitudeUserId: (userId: string) => void;
/**
 * Amplitude 사용자 ID를 초기화합니다. (로그아웃 시 사용)
 */
declare const resetAmplitudeUserId: () => void;
/**
 * Amplitude setUserId 히스토리를 초기화합니다.
 * 로그아웃 후 새로운 사용자로 로그인할 때 사용합니다.
 */
declare const resetAmplitudeSetUserIdHistory: () => void;

export { type SessionReplayConfig, appendAmplitudeUserProperty, destroyBrazeInstance, disableBrazeSDK, enableBrazeSDK, getAmplitudeInstance, getBrazeInstance, initCPLog, removeAmplitudeUserProperty, requestBrazeNotificationPermission, resetAmplitudeSetUserIdHistory, resetAmplitudeUserId, resetBrazeChangeUserHistory, sendCPLog, setAmplitudeSessionReplayConfig, setAmplitudeUserId, setAmplitudeUserProperties, setAmplitudeUserProperty, startAmplitudeSessionReplay, startAmplitudeSessionReplayForEndpoint, stopAmplitudeSessionReplay, unsetAmplitudeUserProperty };
