// ref - https://github.com/nuxt/nuxt/issues/26565
export default defineNuxtPlugin((nuxtApp) => {
  const MAX_RETRIES = 2
  const QUERY_PARAM_NAME = 'reload_attempt'

  const reload = () => {
    const url = new URL(window.location.href)
    const hash = url.hash || '' // Get the current hash part

    // Extract path and query from the hash
    const [path, queryString] = hash.split('?')
    const searchParams = new URLSearchParams(queryString || '')
    const currentRetry = Number(searchParams.get(QUERY_PARAM_NAME)) || 0

    if (currentRetry < MAX_RETRIES) {
      console.log('[nuxt]: Reloading due to chunk error')
      searchParams.set(QUERY_PARAM_NAME, (currentRetry + 1).toString())

      // Rebuild the hash with updated query params
      const newHash = `${path}?${searchParams.toString()}`
      url.hash = newHash

      window.location.replace(url.toString())
      // sometimes replace will not causes a refresh so we have to reload page
      window.location.reload()
    }
  }

  // Handle "Failed to fetch dynamically imported module ..." or similar issues
  nuxtApp.hook('app:chunkError', () => {
    reload()
  })

  nuxtApp.hook('app:error', (error) => {
    const reload_error_list = [
      'error loading dynamically imported module',
      'Importing a module script failed',
      'Failed to fetch dynamically imported module',
    ]
    for (const message of reload_error_list) {
      if (ncIsString(error?.message) && error.message.includes(message)) {
        reload()
      }
    }
  })
})
