import { Badge } from '@tidbcloud/uikit'
import { capitalize } from 'lodash-es'

import { useDedicatedRestoreProgress, useServerlessRestoreProgress } from 'dbaas/features/BackupRestore'
import { RestoreStatus } from 'dbaas/features/BackupRestore/RestoreStatus'
import { SharedCluster } from 'dbaas/features/ClusterManagement/cluster'
import { useOrgProjectClusterIds } from 'dbaas/features/Common'
import { SharedTiDB } from 'dbaas/screens/NextGen/shared/model/shared-tidb-state'
import { ClusterDisplayStatus } from 'dbaas/services'
import { Commonv1beta1ClusterState } from 'dbaas/services/api-clients/v2023/dedicated/v1beta1/interface'
import { useTidbServiceGetRestoreStatus } from 'dbaas/services/api-clients/v2025/tidb-management/v1beta2'
import { DataflowRestoreStatus } from 'dbaas/services/dataflow/interface'

export const truncateStr = (str: string, length = 36) => {
  if (!str) {
    return ''
  }
  return str.length > length ? str.slice(0, length) + '...' : str
}

export const ClusterStatusWithRestoreProgress = ({ cluster }: { cluster: SharedCluster | SharedTiDB }) => {
  const status = cluster?.state
  const id = 'id' in cluster ? cluster?.id : cluster.tidbId || ''
  const isRestoring = status === Commonv1beta1ClusterState.RESTORING
  const usesPremiumRestoreProgress =
    cluster.computed.isPremium ||
    cluster.computed.isBYOC ||
    cluster.computed.isPremiumReserved ||
    cluster.computed.isEssentialV2
  const usesServerlessRestoreProgress = cluster.computed.isServerless && !usesPremiumRestoreProgress

  const { data: dedicatedRestoreProgressData } = useDedicatedRestoreProgress(id, {
    enabled: cluster?.computed.isDedicated === true && isRestoring
  })

  const { data: serverlessRestoreProgressData } = useServerlessRestoreProgress(id, {
    enabled: usesServerlessRestoreProgress && isRestoring
  })

  const { orgId, projectId } = useOrgProjectClusterIds()
  const { data: premiumRestoreProgressData } = useTidbServiceGetRestoreStatus(
    id || '',
    { orgId, projectId },
    {
      query: {
        enabled: !!orgId && !!projectId && !!id && isRestoring && usesPremiumRestoreProgress
      }
    }
  )

  if (isRestoring) {
    let name = 'Restoring'
    let progress = 0

    if (usesServerlessRestoreProgress) {
      progress = serverlessRestoreProgressData?.percent ?? 0
    } else if (cluster?.computed.isDedicated === true) {
      progress = dedicatedRestoreProgressData?.progress ?? 0
    } else if (usesPremiumRestoreProgress) {
      progress = premiumRestoreProgressData?.progress ?? 0
    }

    name = progress > 0 ? `${name} (${progress}%)` : name

    return <RestoreStatus status={DataflowRestoreStatus.RESTORE_STATUS_RUNNING} progress={progress} name={name} />
  }

  return <StateTag displayStatus={status} />
}

export const StateTag = ({
  displayStatus,
  suffix,
  badgeOnly
}: {
  displayStatus?: ClusterDisplayStatus | Commonv1beta1ClusterState
  suffix?: string
  badgeOnly?: boolean
}) => {
  const statusMap: {
    [index: string]: string
  } = {
    [ClusterDisplayStatus.DISPLAY_CREATING]: 'carbon.6',
    [ClusterDisplayStatus.DISPLAY_RESTORING]: 'carbon.6',
    [ClusterDisplayStatus.DISPLAY_AVAILABLE]: 'green',
    [ClusterDisplayStatus.DISPLAY_UNAVAILABLE]: 'red',
    [ClusterDisplayStatus.DISPLAY_PAUSING]: 'yellow',
    [ClusterDisplayStatus.DISPLAY_PAUSED]: 'yellow',
    [ClusterDisplayStatus.DISPLAY_IMPORTING]: 'peacock',
    [ClusterDisplayStatus.DISPLAY_MODIFYING]: 'peacock',
    [ClusterDisplayStatus.DISPLAY_RESUMING]: 'yellow',

    [Commonv1beta1ClusterState.CREATING]: 'carbon.6',
    [Commonv1beta1ClusterState.RESTORING]: 'carbon.6',
    [Commonv1beta1ClusterState.ACTIVE]: 'green',
    [Commonv1beta1ClusterState.INACTIVE]: 'red',
    [Commonv1beta1ClusterState.PAUSING]: 'yellow',
    [Commonv1beta1ClusterState.PAUSED]: 'yellow',
    [Commonv1beta1ClusterState.IMPORTING]: 'peacock',
    [Commonv1beta1ClusterState.MODIFYING]: 'peacock',
    [Commonv1beta1ClusterState.RESUMING]: 'yellow',
    [Commonv1beta1ClusterState.UPGRADING]: 'peacock',
    [Commonv1beta1ClusterState.MAINTENANCE]: 'yellow'
  }
  let status = capitalize((displayStatus || '').replace('DISPLAY_', ''))
  if (suffix) {
    status += ` ${suffix}`
  }
  return (
    <Badge color={statusMap[displayStatus || '']} variant="dot" size="lg" sx={{ pointerEvents: 'none' }}>
      {badgeOnly ? undefined : status}
    </Badge>
  )
}
