import { onUnmounted } from 'vue'
import { isClient } from '@vueuse/core'
import { addClass, getScrollBarWidth, getStyle, hasClass, removeClass } from '@kankan/utils'

export const useLockScreen = () => {
    let scrollBarWidth = 0
    let withoutHiddenClass = false
    let bodyPaddingRight = '0'
    let computedBodyPaddingRight = 0

    onUnmounted(() => {
        cleanup()
    })

    const cleanup = () => {
        if (!isClient) return
        removeClass(document.body, 'el-popup-parent--hidden')
        if (withoutHiddenClass) {
            document.body.style.paddingRight = bodyPaddingRight
        }
    }

    const lock = () => {
        if (!isClient) return
        withoutHiddenClass = !hasClass(document.body, 'el-popup-parent--hidden')
        if (withoutHiddenClass) {
            bodyPaddingRight = document.body.style.paddingRight
            computedBodyPaddingRight = Number.parseInt(getStyle(document.body, 'paddingRight'), 10)
        }
        scrollBarWidth = getScrollBarWidth()
        const bodyHasOverflow = document.documentElement.clientHeight < document.body.scrollHeight
        const bodyOverflowY = getStyle(document.body, 'overflowY')
        if (scrollBarWidth > 0 && (bodyHasOverflow || bodyOverflowY === 'scroll') && withoutHiddenClass) {
            document.body.style.paddingRight = `${computedBodyPaddingRight + scrollBarWidth}px`
        }
        addClass(document.body, 'el-popup-parent--hidden')
    }

    return {
        lock,
        cleanup,
    }
}
