import { Divider, Paper } from '@tidbcloud/uikit'
import { observer } from 'mobx-react'
import { useEffect, useMemo } from 'react'
import { useFormContext } from 'react-hook-form'

import { useDualLayerDataEncryptionFeatEnabled } from 'dbaas/screens/NextGen/my-tidb-creation/shared/premium-byoc/dual-layer-data-encryption/use-dual-layer-data-encryption-feat-enabled'
import { useCreateResourceRoleState } from 'dbaas/screens/NextGen/shared/access/create-resource-role'
import { Commonv1beta1ServicePlan } from 'dbaas/services/api-clients/v2025/tidb-management/v1beta2/interface'
import useStores from 'dbaas/stores/useStores'

import { useVirtualProjectId } from '../../shared/use-virtual-project-id'

import { BasicSettingsSection } from './sections/BasicSettingsSection'
import { CapacitySection } from './sections/CapacitySection'
import { EncryptionSection } from './sections/EncryptionSection'
import { HighAvailabilitySection } from './sections/HighAvailabilitySection'
import { EssentialV2FormValue } from './types'
import { useEssentialV2Regions } from './use-essential-v2-regions'

interface EssentialV2FormProps {
  formId: string
  planSelector: React.ReactNode
  onSubmit: () => void
}

export const EssentialV2Form = observer(({ formId, planSelector, onSubmit }: EssentialV2FormProps) => {
  const {
    store: {
      lastVisitLocation: { projectId: currentProjectId }
    },
    actions: { fetchUserProfileV2 }
  } = useStores()

  const { watch, getValues, setValue } = useFormContext<EssentialV2FormValue>()
  const provider = watch('provider')
  const projectId = watch('projectId')
  const virtualProjectId = useVirtualProjectId()
  const { ownerProjects, isOrgOwner, isAnyProjectOwner } = useCreateResourceRoleState()
  const effectiveProjectId = isOrgOwner ? projectId || virtualProjectId : projectId
  const { cloudProviders, regions, isLoading } = useEssentialV2Regions(effectiveProjectId, provider)
  const { isEnabled: isDataEncryptionFeatEnabled } = useDualLayerDataEncryptionFeatEnabled({
    servicePlan: Commonv1beta1ServicePlan.Essential_V2,
    cloudProvider: provider
  })

  const eligibleProjects = useMemo(
    () => ownerProjects.filter((project) => !project.aws_cmek_enabled && project.type === 'tidbx'),
    [ownerProjects]
  )
  const projectOptions = useMemo(
    () => eligibleProjects.map((p) => ({ value: p.id, label: p.name })),
    [eligibleProjects]
  )

  useEffect(() => {
    const nextProvider = cloudProviders[0]
    if (!nextProvider) {
      return
    }

    if (!provider || !cloudProviders.includes(provider)) {
      setValue('provider', nextProvider)
    }
  }, [provider, cloudProviders, setValue])

  useEffect(() => {
    const currentRegion = getValues('region')
    const nextRegion = regions?.[0]?.regionId ?? ''
    if (!currentRegion || !regions?.some((r) => r.regionId === currentRegion)) {
      setValue('region', nextRegion)
    }
  }, [regions, setValue, getValues])

  useEffect(() => {
    if (isOrgOwner || !isAnyProjectOwner) {
      return
    }

    const selectedProjectId = getValues('projectId')
    const hasValidProjectSelection =
      !!selectedProjectId && eligibleProjects.some((project) => project.id === selectedProjectId)
    if (hasValidProjectSelection) {
      return
    }

    const nextProjectId =
      eligibleProjects.find((project) => project.id === currentProjectId)?.id || eligibleProjects[0]?.id || ''

    setValue('projectId', nextProjectId, { shouldValidate: true })
  }, [currentProjectId, eligibleProjects, getValues, isAnyProjectOwner, isOrgOwner, setValue])

  useEffect(() => {
    if (!isDataEncryptionFeatEnabled) {
      setValue('encrypted', false)
    }
  }, [isDataEncryptionFeatEnabled, setValue])

  return (
    <Paper component="form" id={formId} onSubmit={onSubmit} withBorder shadow="none">
      {planSelector}

      <Divider />
      <BasicSettingsSection
        cloudProviders={cloudProviders}
        regions={regions}
        disabled={isLoading}
        projectOptions={projectOptions}
        onProjectCreated={() => fetchUserProfileV2()}
        projectOptional={isOrgOwner}
      />
      <Divider />
      <CapacitySection projectId={effectiveProjectId} />
      <Divider />
      {isDataEncryptionFeatEnabled && (
        <>
          <EncryptionSection />
          <Divider />
        </>
      )}
      <HighAvailabilitySection />
    </Paper>
  )
})
