// core/amplitude-manager.js
(function() {
    'use strict';
    
    if (window.AmplitudeManager) {
        return; // 이미 로드된 경우 중복 로드 방지
    }

class AmplitudeManager {
    constructor() {
        this.API_KEY = '84d2fa4adcfc257c6874a3db2f80f9d0';
        this.ENDPOINT = 'https://api2.amplitude.com/2/httpapi';
        this.USER_ID_KEY = 'her_user_id';
    }

    // 🔥 Extension context 유효성 체크
    isExtensionContextValid() {
        try {
            return !!(chrome && chrome.runtime && chrome.runtime.id);
        } catch (error) {
            return false;
        }
    }

    // 사용자 ID 생성 또는 가져오기
    async getOrCreateUserId() {
        // 🔥 Extension context 유효성 체크
        if (!this.isExtensionContextValid()) {
            // Fallback으로 임시 ID 생성
            return 'temp_' + Date.now();
        }

        try {
            const result = await chrome.storage.local.get([this.USER_ID_KEY]);
            if (result[this.USER_ID_KEY]) {
                return result[this.USER_ID_KEY];
            }
            const newUserId = crypto.randomUUID();
            await chrome.storage.local.set({ [this.USER_ID_KEY]: newUserId });
            return newUserId;
        } catch (error) {
            console.error('[Amplitude] Storage access 실패:', error);
            // Fallback으로 임시 ID 생성
            return 'temp_' + Date.now();
        }
    }

    // 기본 이벤트 전송
    async trackEvent(eventType, eventProperties = {}) {
        try {
            // 🔥 Extension context 유효성 체크
            if (!this.isExtensionContextValid()) {
                // console.log('[Amplitude] Extension context 무효 - 이벤트 전송 건너뜀');
                return;
            }

            const userId = await this.getOrCreateUserId();
            
            const event = {
                user_id: userId,
                event_type: eventType,
                time: Date.now(),
                platform: 'Chrome Extension',
                app_version: chrome.runtime.getManifest().version,
                language: navigator.language,
                event_properties: eventProperties
            };

            this.sendRequest([event]);
        } catch (error) {
            console.error(`[Amplitude] Failed to track event: ${eventType}`, error);
        }
    }

    // 사용자 속성 설정
    async setUserProperties(properties) {
        try {
            // 🔥 Extension context 유효성 체크
            if (!this.isExtensionContextValid()) {
                return;
            }

            const userId = await this.getOrCreateUserId();
            const identifyEvent = {
                user_id: userId,
                event_type: '$identify',
                user_properties: {
                    '$set': properties
                }
            };
            this.sendRequest([identifyEvent]);
        } catch (error) {
            console.error('[Amplitude] Failed to set user properties', error);
        }
    }
    
    // 사용자 속성 값 증가/감소
    async incrementUserProperty(property, value = 1) {
        try {
            // 🔥 Extension context 유효성 체크
            if (!this.isExtensionContextValid()) {
                return;
            }

            const userId = await this.getOrCreateUserId();
            const identifyEvent = {
                user_id: userId,
                event_type: '$identify',
                user_properties: {
                    '$add': { [property]: value }
                }
            };
            this.sendRequest([identifyEvent]);
        } catch (error) {
            console.error(`[Amplitude] Failed to increment property: ${property}`, error);
        }
    }

    // 최초 1회만 사용자 속성 설정
    async setUserPropertiesOnce(properties) {
        try {
            // 🔥 Extension context 유효성 체크
            if (!this.isExtensionContextValid()) {
                return;
            }

            const userId = await this.getOrCreateUserId();
            const identifyEvent = {
                user_id: userId,
                event_type: '$identify',
                user_properties: {
                    '$setOnce': properties
                }
            };
            this.sendRequest([identifyEvent]);
        } catch (error) {
            console.error('[Amplitude] Failed to set user properties once', error);
        }
    }

    // API 요청 전송
    async sendRequest(events) {
        // 🔥 Extension context 유효성 체크
        if (!this.isExtensionContextValid()) {
            // console.log('[Amplitude] Extension context 무효 - API 요청 건너뜀');
            return;
        }

        try {
            const payload = {
                api_key: this.API_KEY,
                events: events
            };

            const response = await fetch(this.ENDPOINT, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'Accept': '*/*'
                },
                body: JSON.stringify(payload)
            });

            // 🔥 HTTP 상태 코드 체크
            if (!response.ok) {
                console.warn(`[Amplitude] HTTP 에러: ${response.status} ${response.statusText}`);
                return;
            }

            // console.log('[Amplitude] 이벤트 전송 성공');
        } catch (error) {
            // 🔥 네트워크 에러를 조용히 처리 (사용자에게 영향 없도록)
            if (error.name === 'TypeError' && error.message.includes('Failed to fetch')) {
                // 네트워크 연결 문제나 CORS 에러 - 조용히 무시
                // console.log('[Amplitude] 네트워크 연결 문제로 이벤트 전송 실패');
            } else {
                console.error('[Amplitude] 예상치 못한 에러:', error);
            }
        }
    }
}

// 싱글톤 인스턴스
window.AmplitudeManager = AmplitudeManager;
window.amplitude = new AmplitudeManager();

})(); // IIFE 닫기