export default defineNuxtRouteMiddleware(async (to, from) => {
  // Skip running middleware before masto has been initialised
  if (!useNuxtApp().$masto)
    return

  if (!('server' in to.params))
    return

  if (!currentUser.value) {
    if (from.params.server !== to.params.server) {
      await loginTo({
        server: to.params.server as string,
      })
    }
    return
  }

  // No need to additionally resolve an id if we're already logged in
  if (currentUser.value.server === to.params.server)
    return

  // Tags don't need to be redirected to a local id
  if (to.params.tag)
    return

  // Handle redirecting to new permalink structure for users with old links
  if (!to.params.server) {
    return {
      ...to,
      params: {
        ...to.params,
        server: currentUser.value.server,
      },
    }
  }

  try {
    // If we're logged in, search for the local id the account or status corresponds to
    const { value } = await useMasto().search({ q: `https:/${to.fullPath}`, resolve: true, limit: 1 }).next()

    const { accounts, statuses } = value
    if (statuses[0])
      return getStatusRoute(statuses[0])

    if (accounts[0])
      return getAccountRoute(accounts[0])
  }
  catch {}

  return '/home'
})