import { ref, watch } from 'vue'
import { useRoute } from 'vue-router'
import { useDebounceFn, useStorage } from '@vueuse/core'

export function useActiveTabManager(tabs, storageKey) {
  const activieTab = useStorage(storageKey, 'activity')
  const route = useRoute()

  const preserveLastVisitedTab = useDebounceFn((tabName) => {
    activieTab.value = tabName.toLowerCase()
  }, 300)

  function setActiveTabInUrl(tabName) {
    window.location.hash = '#' + tabName.toLowerCase()
  }

  function getActiveTabFromUrl() {
    return route.hash.replace('#', '')
  }

  function findTabIndex(tabName) {
    return tabs.value.findIndex(
      (tabOptions) => tabOptions.name.toLowerCase() === tabName,
    )
  }

  function getTabIndex(tabName) {
    let index = findTabIndex(tabName)
    return index !== -1 ? index : 0 // Default to the first tab if not found
  }

  function getActiveTabFromLocalStorage() {
    return activieTab.value
  }

  function getActiveTab() {
    let activeTab = getActiveTabFromUrl()
    if (activeTab) {
      let index = findTabIndex(activeTab)
      if (index !== -1) {
        preserveLastVisitedTab(activeTab)
        return index
      }
      return 0
    }

    let lastVisitedTab = getActiveTabFromLocalStorage()
    if (lastVisitedTab) {
      setActiveTabInUrl(lastVisitedTab)
      return getTabIndex(lastVisitedTab)
    }

    return 0 // Default to the first tab if nothing is found
  }

  const tabIndex = ref(getActiveTab())

  watch(tabIndex, (tabIndexValue) => {
    let currentTab = tabs.value[tabIndexValue].name
    setActiveTabInUrl(currentTab)
    preserveLastVisitedTab(currentTab)
  })

  watch(
    () => route.hash,
    (tabValue) => {
      if (!tabValue) return

      let tabName = tabValue.replace('#', '')
      let index = findTabIndex(tabName)
      if (index === -1) index = 0

      let currentTab = tabs.value[index].name
      preserveLastVisitedTab(currentTab)
      tabIndex.value = index
    },
  )

  return { tabIndex }
}
