import {
    IBlazeAnalytics,
    IBlazeError
} from '../interfaces';
import { RegisterGlobalEvents } from './RegisterGlobalEvents';

export interface BlazeGlobalDelegate {
    onEventTriggered?: (params: BlazeOnEventTriggeredParams) => void
    onErrorThrown?: (params: BlazeOnErrorThrownParams) => void
}

export interface BlazeOnEventTriggeredParams {
    event: IBlazeAnalytics;
}

export interface BlazeOnErrorThrownParams {
    error: IBlazeError;
}

export class BlazeGlobalDelegateHelper {

    static registerGlobalDelegate(globalDelegate?: BlazeGlobalDelegate | null) {
        BlazeGlobalDelegateHelper.onEventTriggered(globalDelegate?.onEventTriggered)
        BlazeGlobalDelegateHelper.onErrorThrown(globalDelegate?.onErrorThrown)
    }

    private static onEventTriggered(
        callback?: (params: BlazeOnEventTriggeredParams) => void,
    ) {
        const eventName = 'Blaze.onEventTriggered'
        if (callback) {
            RegisterGlobalEvents.createEventSubscription(
                eventName,
                data => {
                    try {
                        if (data) {
                            const parsed = JSON.parse(data['eventData']);
                            callback({
                                event: parsed as IBlazeAnalytics
                            });
                        } else {
                            console.error('onEventTriggered: was called with no data.');
                        }
                    } catch (e) {
                        console.error('onEventTriggered', e);
                    }
                },
            );
        } else {
            RegisterGlobalEvents.cancelEventSubscription(eventName)
        }
        
    }

    private static onErrorThrown(
        callback?: (params: BlazeOnErrorThrownParams) => void,
    ) {
        const eventName = 'Blaze.onErrorThrown'
        if (callback) {
            RegisterGlobalEvents.createEventSubscription(
                eventName,
                data => {
                    try {
                        callback({
                            error: data as IBlazeError 
                        })
                    } catch (e) {
                        console.error('onErrorThrown', e);
                    }
                },
            );
        } else {
            RegisterGlobalEvents.cancelEventSubscription(eventName)
        }
    }

}