import { computed, onUnmounted, unref, watchEffect } from 'vue'
import { useThrottleFn } from '@vueuse/core'

import { useAppStore } from '/@/store/modules/app'
import { useLockStore } from '/@/store/modules/lock'

import { useUserStore } from '/@/store/modules/user'
import { useRootSetting } from '../setting/useRootSetting'

export function useLockPage() {
    const { getLockTime } = useRootSetting()
    const lockStore = useLockStore()
    const userStore = useUserStore()
    const appStore = useAppStore()

    let timeId: TimeoutHandle

    function clear(): void {
        window.clearTimeout(timeId)
    }

    function resetCalcLockTimeout(): void {
        // not login
        if (!userStore.getToken) {
            clear()
            return
        }
        const lockTime = appStore.getProjectConfig.lockTime
        if (!lockTime || lockTime < 1) {
            clear()
            return
        }
        clear()

        timeId = setTimeout(() => {
            lockPage()
        }, lockTime * 60 * 1000)
    }

    function lockPage(): void {
        lockStore.setLockInfo({
            isLock: true,
            pwd: undefined,
        })
    }

    watchEffect((onClean) => {
        if (userStore.getToken) {
            resetCalcLockTimeout()
        } else {
            clear()
        }
        onClean(() => {
            clear()
        })
    })

    onUnmounted(() => {
        clear()
    })

    const keyupFn = useThrottleFn(resetCalcLockTimeout, 2000)

    return computed(() => {
        if (unref(getLockTime)) {
            return { onKeyup: keyupFn, onMousemove: keyupFn }
        } else {
            clear()
            return {}
        }
    })
}
