import { useComputedColorScheme } from '@tidbcloud/uikit'
import { NavMenuPortal } from '@tidbcloud/uikit/biz'
import {
  IconBarLineChart,
  IconCodeSquare02,
  IconDataflow03,
  IconGitMerge,
  IconHome02,
  IconIntegration,
  IconPuzzlePiece01,
  IconSettings02
} from '@tidbcloud/uikit/icons'
import { observer } from 'mobx-react'
import { useMemo } from 'react'

import config from 'config'
import { SharedCluster } from 'dbaas/features/ClusterManagement/cluster'
import { useChat2queryClusterTips, useSQLUsersEnabled } from 'dbaas/features/ClusterManagement/feats'
import { useSqlEditorStatus } from 'dbaas/features/ClusterManagement/feats/chat2query/status'
import { useBranchAvailability } from 'dbaas/features/ClusterManagement/feats/use-branch-availability'
import { useOrgProjectClusterIds } from 'dbaas/features/Common'
import { useNextGenMode } from 'dbaas/features/Organization/mode'
import { CloudProviderConst } from 'dbaas/features/Project/profile'
import { NavItemProps, NavMenu } from 'dbaas/layouts/v5/SideNavbar/components/NavMenu'
import { useIntegrationMigrationStatus } from 'dbaas/screens/Project/integrations/useIntegrationMigrationStatus'
import { useGetExpWhiteList } from 'dbaas/services'
import { Commonv1beta1ServicePlan } from 'dbaas/services/api-clients/v2025/tidb-management/v1beta2/interface'
import { ExpFeatHashmap } from 'dbaas/stores/localStorage'
import useStores from 'dbaas/stores/useStores'
import { compareVersion } from 'dbaas/utils/chore'
import { eventTracking } from 'dbaas/utils/tracking'

import {
  isDedicatedAuditLogVersionEnabled,
  useAuditLogEnabled,
  useChangefeedEnabled,
  useClusterDbAuditLogIsLegacy,
  useDMEnabled,
  useEssentialAuditLogEnabled,
  useOverviewEnabled
} from './helpers'

interface SidebarProps {
  cluster: SharedCluster
  hidden?: boolean
}

const TOP_SQL_PROVIDER_REGION_ALLOW_LIST: Record<string, Set<string>> = {}

const Sidebar = observer(({ cluster }: SidebarProps) => {
  const { isNextGen } = useNextGenMode()
  const basePath = isNextGen ? '/tidbs' : '/clusters'
  const clusterId = cluster.id
  const commonDisabled = cluster.computed?.creating || cluster.computed?.recovering

  const overviewEnabled = useOverviewEnabled(cluster)
  const { show: dmShowed, enable: dmEnabled, tooltip: dmTooltip } = useDMEnabled(cluster)
  const cdcEnabled = useChangefeedEnabled(cluster)
  const sqlEditorState = useSqlEditorStatus(cluster)
  const branchAvailability = useBranchAvailability(cluster)
  const sqlUsersEnabled = useSQLUsersEnabled(cluster)
  const auditLogEnabled = useAuditLogEnabled()
  const essentialAuditLogEnabled = useEssentialAuditLogEnabled()
  const isAuditLogLegacy = useClusterDbAuditLogIsLegacy(cluster)
  const dedicatedAuditLogEntranceEnabled =
    auditLogEnabled || (!isAuditLogLegacy && isDedicatedAuditLogVersionEnabled(cluster))

  const calibrateResourceEnabled = useMemo(() => {
    return cluster.computed?.isDedicated && compareVersion(cluster.version, '7.1.0', '>=')
  }, [cluster.version, cluster.computed?.isDedicated])

  const {
    store: {
      config: { enableServerlessEvents, enableSQLUsers }
    }
  } = useStores()

  const colorScheme = useComputedColorScheme()

  const getNavOnClick = (navLabel: string) => {
    const params = {
      'Cluster Type': cluster.computed?.clusterType,
      source: 'LayoutV2 - Cluster - Navbar',
      isDark: colorScheme === 'dark'
    }

    return () => eventTracking(`${navLabel} Nav Clicked`, params)
  }

  const dbAuditLoggingDisabled = useMemo(() => compareVersion(cluster.version, '5.4.0', '<'), [cluster.version])

  const isDatadogEnabled = useIntegrationMigrationStatus('integration_datadog', false)
  const isNewRelicEnabled = useIntegrationMigrationStatus('integration_new_relic', false)
  const integrationDisabled = !isDatadogEnabled && !isNewRelicEnabled

  const chat2queryTooltip = useChat2queryClusterTips(cluster)
  const { orgId } = useOrgProjectClusterIds()
  const useExpWhiteListForTopSQL = config.RELEASE_ENV === 'dev' || config.RELEASE_ENV === 'staging'
  const { data: expNames } = useGetExpWhiteList(orgId, undefined, {
    query: {
      enabled: useExpWhiteListForTopSQL && !!orgId,
      refetchOnWindowFocus: false,
      refetchOnMount: false,
      select(data) {
        return data.exp_names
      }
    }
  })

  const isTopSQLVisibleByProviderRegion = useMemo(() => {
    const provider = cluster.provider?.toLowerCase()

    if (!provider) {
      return false
    }

    if (provider === CloudProviderConst.AWS || provider === CloudProviderConst.ALICLOUD) {
      return true
    }

    const region = cluster.region?.toLowerCase()

    if (!region) {
      return false
    }

    return TOP_SQL_PROVIDER_REGION_ALLOW_LIST[provider]?.has(region) ?? false
  }, [cluster.provider, cluster.region])

  const isTopSQLVisible = useMemo(() => {
    if (useExpWhiteListForTopSQL) {
      return expNames?.includes(ExpFeatHashmap.TopRUVisibility) ?? false
    }

    return isTopSQLVisibleByProviderRegion
  }, [expNames, isTopSQLVisibleByProviderRegion, useExpWhiteListForTopSQL])

  const navs: NavItemProps[] = [
    {
      label: 'Overview',
      path: `${basePath}/${clusterId}/overview`,
      onClick: getNavOnClick('Overview'),
      leftSection: <IconHome02 size={16} />,
      disabled: !overviewEnabled
    },
    {
      label: 'SQL Editor',
      path: `${basePath}/${clusterId}/sqleditor`,
      tooltip: chat2queryTooltip,
      disabled: sqlEditorState.disabled,
      onClick: getNavOnClick('SQL Editor'),
      leftSection: <IconCodeSquare02 size={16} />,
      hidden: !sqlEditorState.visible || cluster.computed.loading
    },
    {
      label: 'Branches',
      path: `${basePath}/${clusterId}/branches`,
      disabled: commonDisabled,
      onClick: getNavOnClick('Branches'),
      leftSection: <IconGitMerge size={16} />,
      hidden: branchAvailability.isLoading || !branchAvailability.enabled
    },
    {
      label: 'Data',
      path: basePath,
      leftSection: <IconDataflow03 size={16} />,
      children: [
        {
          label: 'Import',
          path: `${basePath}/${clusterId}/imports`,
          disabled: commonDisabled,
          onClick: getNavOnClick('Import'),
          'data-testid': 'sidebar-nav-item-import'
        },
        {
          label: 'Export',
          path: `${basePath}/${clusterId}/exports`,
          disabled: commonDisabled,
          onClick: getNavOnClick('Export'),
          hidden: !cluster.computed?.isServerless,
          'data-testid': 'sidebar-nav-item-export'
        },
        {
          label: 'Data Migration',
          path: `${basePath}/${clusterId}/data-migration`,
          tooltip: dmTooltip,
          disabled: commonDisabled || !dmEnabled,
          onClick: getNavOnClick('Data Migration'),
          hidden: !dmShowed
        },
        {
          label: 'Changefeed',
          path: `${basePath}/${clusterId}/changefeed`,
          disabled: commonDisabled,
          onClick: getNavOnClick('Changefeed'),
          hidden: !cdcEnabled
        },
        {
          label: 'Backup',
          path: `${basePath}/${clusterId}/backup`,
          disabled: commonDisabled,
          onClick: getNavOnClick('Backup'),
          'data-testid': 'sidebar-nav-item-backup'
        }
      ]
    },
    {
      label: 'Monitoring',
      path: basePath,
      leftSection: <IconBarLineChart size={16} />,
      children: [
        {
          label: 'Diagnosis',
          path: `${basePath}/${clusterId}/diagnosis`,
          disabled: commonDisabled,
          onClick: getNavOnClick('Diagnosis')
        },
        {
          label: 'Metrics',
          path: `${basePath}/${clusterId}/metrics`,
          disabled: commonDisabled,
          onClick: getNavOnClick('Metrics')
        },
        {
          label: 'Top RU',
          path: `${basePath}/${clusterId}/top-ru`,
          disabled: commonDisabled,
          onClick: getNavOnClick('Top RU'),
          hidden: !cluster.computed?.isEssential || !isTopSQLVisible,
          'data-testid': 'sidebar-nav-item-top-ru'
        },
        {
          label: 'Nodes',
          path: `${basePath}/${clusterId}/nodes`,
          disabled: commonDisabled,
          onClick: getNavOnClick('Nodes'),
          hidden: !cluster.computed?.isDedicated
        },
        {
          label: 'Alerts',
          path: `${basePath}/${clusterId}/alerts`,
          disabled: commonDisabled,
          onClick: getNavOnClick('Alerts'),
          hidden: !cluster.computed?.isDedicated && !cluster.computed?.isEssential
        },
        {
          label: 'Events',
          path: `${basePath}/${clusterId}/events`,
          disabled: commonDisabled,
          onClick: getNavOnClick('Events'),
          hidden: !(cluster.computed?.isDedicated || enableServerlessEvents)
        },
        {
          label: 'Calibrate Resource',
          path: `${basePath}/${clusterId}/calibrate_resource`,
          disabled: commonDisabled,
          onClick: getNavOnClick('Calibrate Resource'),
          hidden: !calibrateResourceEnabled
        }
      ]
    },
    {
      label: 'Integrations',
      path: `${basePath}/${clusterId}/integrations`,
      disabled: commonDisabled,
      onClick: getNavOnClick('Cluster Integrations'),
      leftSection: <IconIntegration size={16} />,
      hidden: !cluster.computed?.isServerless
    },
    {
      label: 'Settings',
      path: `${basePath}/${clusterId}/settings`,
      leftSection: <IconSettings02 size={16} />,
      children: cluster.computed?.isServerless
        ? [
            {
              label: 'SQL Users',
              path: `${basePath}/${clusterId}/sql-users`,
              tooltip: sqlUsersEnabled.tips,
              disabled: commonDisabled || !sqlUsersEnabled.enabled,
              onClick: getNavOnClick('SQL Users'),
              hidden: !enableSQLUsers,
              'data-testid': 'sidebar-nav-item-sql-users'
            },
            {
              label: 'Networking',
              path: `${basePath}/${clusterId}/networking`,
              disabled: commonDisabled,
              onClick: getNavOnClick('Network'),
              'data-testid': 'sidebar-nav-item-networking'
            },
            {
              label: 'DB Audit Logging',
              path: `${basePath}/${clusterId}/audit-log`,
              disabled: commonDisabled || dbAuditLoggingDisabled,
              onClick: getNavOnClick('DB Audit Log'),
              hidden: !essentialAuditLogEnabled || cluster?.servicePlan !== Commonv1beta1ServicePlan.Essential,
              'data-testid': 'sidebar-nav-item-audit-log'
            },
            {
              label: 'Alert Subscription',
              path: `/clusters/${clusterId}/alert-subscription`,
              disabled: commonDisabled,
              onClick: getNavOnClick('Alert Subscription'),
              hidden: !cluster.computed?.isEssential
            }
          ]
        : [
            {
              label: 'Networking',
              path: `${basePath}/${clusterId}/networking`,
              disabled: commonDisabled,
              onClick: getNavOnClick('Network'),
              'data-testid': 'sidebar-nav-item-networking'
            },
            {
              label: 'SQL Users',
              path: `${basePath}/${clusterId}/sql-users`,
              tooltip: sqlUsersEnabled.tips,
              disabled: commonDisabled || !sqlUsersEnabled.enabled,
              onClick: getNavOnClick('SQL Users'),
              hidden: !enableSQLUsers,
              'data-testid': 'sidebar-nav-item-sql-users'
            },
            {
              label: 'DB Audit Logging',
              path: `${basePath}/${clusterId}/audit-log`,
              disabled: commonDisabled || dbAuditLoggingDisabled,
              onClick: getNavOnClick('DB Audit Log'),
              hidden: !dedicatedAuditLogEntranceEnabled,
              'data-testid': 'sidebar-nav-item-audit-log'
            },
            {
              label: 'Security',
              path: `${basePath}/${clusterId}/security`,
              disabled: commonDisabled,
              onClick: getNavOnClick('Security')
            },
            {
              label: 'Integrations',
              path: `${basePath}/${clusterId}/integration`,
              disabled: commonDisabled,
              onClick: getNavOnClick('Integration'),
              leftSection: <IconPuzzlePiece01 size={16} />,
              hidden: !cluster.computed.isDedicated || integrationDisabled
            }
          ]
    }
  ]

  return (
    <NavMenuPortal>
      <NavMenu navList={navs} />
    </NavMenuPortal>
  )
})

export default Sidebar
