import { observer } from 'mobx-react'
import { useMemo } from 'react'

import useStores from 'dbaas/stores/useStores'

import { useCanonicalTidbResourceContext } from '../runtime/metadata-adapter'
import { useRoleIndex } from '../runtime/role-index'

import { AccessContext } from './access-context'
import { useTidbId } from './use-tidb-id'

export const AccessProvider = observer(({ children }: React.PropsWithChildren) => {
  const {
    store: {
      lastVisitLocation: { orgId, projectId: lastVisitedProjectId }
    }
  } = useStores()
  const tidbId = useTidbId()
  const tidbResourceContext = useCanonicalTidbResourceContext({
    enableMiniListFallback: false,
    orgId,
    tidbId
  })
  const roleIndexState = useRoleIndex()

  const projectId = tidbId ? tidbResourceContext.data?.projectId || '' : lastVisitedProjectId

  const ctxValue = useMemo(() => {
    return {
      orgId,
      projectId,
      tidbId,
      tidbResourceContext: tidbResourceContext.data,
      tidbResourceContextState: tidbResourceContext,
      roleIndexState
    }
  }, [orgId, projectId, tidbId, tidbResourceContext, roleIndexState])

  return <AccessContext.Provider value={ctxValue}>{children}</AccessContext.Provider>
})
