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 DeeplinkInteractor = {
    listen(): void
}

export type DeeplinkModuleDependency = ReturnType<typeof createDependency.DeeplinkModule>

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

export type DeeplinkModule = ReturnType<typeof createDeeplinkModule>

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

    // define member
    let cache: string | undefined
    let listener: (deeplink: string) => void = (deeplink) => {
        cache = deeplink
    }

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

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

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

        listener = onReceived
    }

    // create object
    return {
        setOnDeeplinkReceived,
    }
}
