import { useEffect } from 'react'
import { useFormContext } from 'react-hook-form'

import { HighAvailabilitySection as SharedHighAvailabilitySection } from 'dbaas/screens/NextGen/my-tidb-creation/shared/premium-byoc/high-availability/HighAvailabilitySection'
import { PremiumByocFormValue } from 'dbaas/screens/NextGen/my-tidb-creation/shared/premium-byoc/types'
import { useVirtualProjectId } from 'dbaas/screens/NextGen/my-tidb-creation/shared/use-virtual-project-id'
import { useResourcePoolServiceGetResourcePool } from 'dbaas/services/api-clients/v2025/tidb-management/v1beta2'
import { V1beta2TidbHighAvailabilityType } from 'dbaas/services/api-clients/v2025/tidb-management/v1beta2/interface'
import useStores from 'dbaas/stores/useStores'

const SILENT_BYOC_QUERY_REQUEST = { isShowToast: false, isHandleErr: false }

export function HighAvailabilitySection() {
  const {
    store: {
      lastVisitLocation: { orgId }
    }
  } = useStores()
  const { watch, setValue } = useFormContext<PremiumByocFormValue>()
  const virtualProjectId = useVirtualProjectId()
  const projectId = watch('projectId') || virtualProjectId
  const resourcePoolId = watch('resourcePoolId')
  const highAvailabilityType = watch('highAvailabilityType')
  const { data } = useResourcePoolServiceGetResourcePool(
    resourcePoolId ?? '',
    { orgId, projectId },
    {
      query: {
        enabled: !!(orgId && projectId && resourcePoolId),
        refetchOnWindowFocus: false,
        retry: 1
      },
      request: SILENT_BYOC_QUERY_REQUEST
    }
  )

  const resourcePoolHighAvailabilityType = data?.highAvailabilityType
  const selectedHighAvailabilityType =
    resourcePoolHighAvailabilityType === V1beta2TidbHighAvailabilityType.ZONAL
      ? V1beta2TidbHighAvailabilityType.ZONAL
      : V1beta2TidbHighAvailabilityType.REGIONAL

  useEffect(() => {
    if (!resourcePoolHighAvailabilityType || highAvailabilityType === selectedHighAvailabilityType) {
      return
    }

    setValue('highAvailabilityType', selectedHighAvailabilityType, { shouldValidate: true })
  }, [highAvailabilityType, resourcePoolHighAvailabilityType, selectedHighAvailabilityType, setValue])

  return (
    <SharedHighAvailabilitySection
      optionsOverride={{
        [V1beta2TidbHighAvailabilityType.ZONAL]: {
          disabled: selectedHighAvailabilityType !== V1beta2TidbHighAvailabilityType.ZONAL
        },
        [V1beta2TidbHighAvailabilityType.REGIONAL]: {
          disabled: selectedHighAvailabilityType === V1beta2TidbHighAvailabilityType.ZONAL
        }
      }}
    />
  )
}
