import { Badge, Group, SegmentedControlItem } from '@tidbcloud/uikit'
import { useMemo } from 'react'

import { MetricInfo } from 'dbaas/components/ChartCard/helpers'
import { SharedCluster } from 'dbaas/features/ClusterManagement/cluster'
import { useGetExpWhiteList } from 'dbaas/services/api'
import { ExpFeatHashmap } from 'dbaas/stores/localStorage'

import { DEDICATED_QUICK_RANGES, dedicatedMetricsTabs, getDedicatedMetricsConfig } from './dedicated'
import {
  SERVERLESS_QUICK_RANGES,
  ServerlessMetricsTab,
  serverlessMetricsConfig,
  essentialMetricsConfig,
  serverlessMetricsTabs
} from './serverless'

export interface MetricConfig {
  [k: string]: MetricInfo[]
}

export const useMetricsConfig = (cluster: SharedCluster, orgId: string, showTiproxyMetrics: boolean) => {
  const { data: whiteList } = useGetExpWhiteList(orgId, undefined, {
    query: { enabled: !!orgId, refetchOnMount: false, refetchOnWindowFocus: false }
  })
  const isRUOverviewEnabled = whiteList?.exp_names?.includes(ExpFeatHashmap.RUOverview)
  const isMetricsRetention30DayEnabled = whiteList?.exp_names?.includes(ExpFeatHashmap.MetricsRetention30Day) ?? false

  const configs: MetricConfig = useMemo(() => {
    return cluster.computed.isServerless
      ? cluster.computed.isEssential
        ? essentialMetricsConfig
        : serverlessMetricsConfig
      : getDedicatedMetricsConfig(cluster, orgId, showTiproxyMetrics)
  }, [cluster, orgId, showTiproxyMetrics])

  const tabs = useMemo<SegmentedControlItem[]>(() => {
    const tabList = cluster.computed.isServerless ? serverlessMetricsTabs : dedicatedMetricsTabs
    return tabList
      .filter((t) => {
        if (t === ServerlessMetricsTab.RUOverview) {
          return isRUOverviewEnabled
        }
        return true
      })
      .map((t) => ({
        value: t,
        label:
          t === ServerlessMetricsTab.RUOverview ? (
            <Group gap={8}>
              {t}
              <Badge variant="outline" size="sm" color="carbon" c="carbon.7" fw={500}>
                Preview
              </Badge>
            </Group>
          ) : (
            t
          )
      }))
  }, [cluster.computed.isServerless, isRUOverviewEnabled])

  const quickRanges = useMemo(() => {
    return cluster.computed.isServerless ? SERVERLESS_QUICK_RANGES : DEDICATED_QUICK_RANGES
  }, [cluster.computed.isServerless])

  return { configs, tabs, quickRanges, isMetricsRetention30DayEnabled }
}
