import { Alert } from 'antd'
import { useMemo, useState } from 'react'

import { useListClusterResources } from 'apiClient/services/devops'
import { K8sresourceClusterResource } from 'apiClient/services/devops/interface'

export const AZ_FAULT_ACTIVE_ANNOTATION = 'tidbcloud.com/az-fault-active'

/** Parse fault AZ from Cluster CR YAML. "-" / empty means cleared (not active). */
export function parseAzFaultActiveAz(
  resources?: K8sresourceClusterResource[]
): string | undefined {
  const clusterCr = resources?.find((r) => r.key === 'cluster_cr')
  if (!clusterCr?.content) {
    return undefined
  }

  const match = clusterCr.content.match(
    /(^|\n)\s*"?tidbcloud\.com\/az-fault-active"?\s*:\s*["']?([^\s"'#\n]+)/
  )
  const value = match?.[2]?.trim()
  if (!value || value === '-' || value === 'null' || value === '~') {
    return undefined
  }
  return value
}

export function useAzFaultActiveAz(
  clusterId: string | undefined,
  enabled: boolean
) {
  const { data } = useListClusterResources(clusterId || '', {
    query: {
      enabled: enabled && !!clusterId,
      refetchInterval: false,
      refetchOnWindowFocus: false,
      retry: false
    }
  })

  return useMemo(() => parseAzFaultActiveAz(data?.data?.resources), [data])
}

type AzFaultActiveAlertProps = {
  clusterId: string
  /** Only dedicated clusters expose Cluster CR via cluster-resources. */
  enabled?: boolean
}

export function AzFaultActiveAlert({
  clusterId,
  enabled = true
}: AzFaultActiveAlertProps) {
  const faultAz = useAzFaultActiveAz(clusterId, enabled)
  const [closed, setClosed] = useState(false)

  if (!faultAz || closed) {
    return null
  }

  return (
    <Alert
      banner
      showIcon
      closable
      type="error"
      style={{ marginBottom: 16 }}
      onClose={() => setClosed(true)}
      message={`AZ fault active (${faultAz}): zonal shift / offline AZ may still be in effect — run Recover AZ (with Stop Zonal Shift) when ready.`}
    />
  )
}
