const getTimerHandler = (handler: TimerHandler, moduleWindow: Window) => {
  return (..._args: any[]) => {
    if (moduleWindow['moduleVisibilityState'] === 'visible') {
      if (typeof handler === 'function') {
        handler(..._args)
      } else if (typeof handler === 'string') {
        const evalHander = new moduleWindow['Function'](`return ${handler}`)
        evalHander(..._args)
      }
    }
  }
}
export const smartSetTimeout = (moduleWindow: Window) => {
  const realSetTimeout = moduleWindow.setTimeout
  moduleWindow.setInterval = (handler: TimerHandler, timeout?: number | undefined, ...args: any[]) => {
    const fn = getTimerHandler(handler, moduleWindow)
    const intervalId = realSetTimeout(fn, timeout, ...args)
    return intervalId
  }
}

export const smartSetInterval = (moduleWindow: Window) => {
  const realSetInterval = moduleWindow.setInterval
  moduleWindow.setInterval = (handler: TimerHandler, timeout?: number | undefined, ...args: any[]) => {
    const fn = getTimerHandler(handler, moduleWindow)
    const intervalId = realSetInterval(fn, timeout, ...args)
    return intervalId
  }
}
