import { ref, watch } from 'vue'
import { tryOnUnmounted } from '@vueuse/core'
import { isFunction } from '/@/utils/is'

export function useTimeoutFn(handle: Fn<any>, wait: number, native = false) {
    if (!isFunction(handle)) {
        throw new Error('handle is not Function!')
    }

    const { readyRef, stop, start } = useTimeoutRef(wait)
    if (native) {
        handle()
    } else {
        watch(
            readyRef,
            (maturity) => {
                maturity && handle()
            },
            { immediate: false },
        )
    }
    return { readyRef, stop, start }
}

export function useTimeoutRef(wait: number) {
    const readyRef = ref(false)

    let timer: TimeoutHandle
    function stop(): void {
        readyRef.value = false
        timer && window.clearTimeout(timer)
    }
    function start(): void {
        stop()
        timer = setTimeout(() => {
            readyRef.value = true
        }, wait)
    }

    start()

    tryOnUnmounted(stop)

    return { readyRef, stop, start }
}
