import { NativeModules, NativeEventEmitter } from 'react-native'

import { createInteractor } from '../architecture/Interactor'
import { check } from '../utility/check'
import { log } from '../utility/log'

export const createDependency = () => {}

type AttributionInteractor = {
    listen(): void
}

createDependency.AttributionModule = () => ({
    emitter: new NativeEventEmitter(NativeModules.AttributionInteractor),
    interactor: createInteractor<AttributionInteractor>(NativeModules.AttributionInteractor),
})

export type AttributionModule = ReturnType<typeof createAttributionModule>

export const createAttributionModule= () => {
    // create dependency
    const { emitter, interactor } = createDependency.AttributionModule()

    let cache: Record<string, string> | undefined
    let listener: (result: Record<string, string>) => void = (result) => {
        cache = result
    }

    // initialize
    emitter.addListener('airbridge.attribution', (result) => {
        listener(result)
    })
    interactor.listen()

    // define method
    const setOnAttributionReceived = (
        onReceived: (attribution: Record<string, string>) => void,
    ): void => {
        if (!check.function(onReceived)) {
            log.unmatchedType('onReceived', 'function')
            return
        }

        if (cache !== undefined) {
            onReceived(cache)
            cache = undefined
        }

        listener = onReceived
    }

    // create object
    return {
        setOnAttributionReceived,
    }
}
