import { ActionIcon, Box, Menu } from '@tidbcloud/uikit'
import { IconDotsHorizontal } from '@tidbcloud/uikit/icons'
import { useHistory } from 'react-router-dom'

import { useAccessCheck } from 'dbaas/contexts/access-control'
import { canEditChangefeed } from 'dbaas/features/Changefeed'
import { usePremiumChangefeedActions } from 'dbaas/features/Changefeed/useChangefeedActions'
import { SharedTiDB } from 'dbaas/screens/NextGen/shared/model/shared-tidb-state'
import { Commonv1beta1ClusterState } from 'dbaas/services/api-clients/v2025/tidb-management/v1beta2/interface'
import { ConsoleapiChangefeed, ConsoleapiChangefeedStatus } from 'dbaas/services/dataflow/interface'

export const ChangefeedDetailActionPremium = ({
  changefeed,
  cluster,
  refetch
}: {
  cluster: SharedTiDB
  changefeed: ConsoleapiChangefeed
  refetch?: () => void
}) => {
  const history = useHistory()
  const { handleScale, handlePause, handleResume, handleDelete, ConfirmModal } = usePremiumChangefeedActions({
    cluster,
    refetch
  })

  const isPaused = changefeed.status === ConsoleapiChangefeedStatus.PAUSED
  const isRunning = changefeed.status === ConsoleapiChangefeedStatus.RUNNING
  const isError = changefeed.status === ConsoleapiChangefeedStatus.ERROR
  const isFailed = changefeed.status === ConsoleapiChangefeedStatus.FAILED
  const isWarning = changefeed.status === ConsoleapiChangefeedStatus.WARNING

  const actionAccessible = useAccessCheck('TidbxCDCAction')

  return (
    <>
      <Menu shadow="md" width={200}>
        <Menu.Target>
          <ActionIcon variant="default">
            <Box c="carbon.8" component={IconDotsHorizontal} size={18} />
          </ActionIcon>
        </Menu.Target>

        <Menu.Dropdown>
          <Menu.Item
            disabled={
              !actionAccessible ||
              changefeed.status !== ConsoleapiChangefeedStatus.RUNNING ||
              cluster.state === Commonv1beta1ClusterState.MAINTENANCE
            }
            data-mp-event="Open Changefeed Scale Up/Down Dialog Clicked"
            onClick={() => handleScale(changefeed)}
          >
            Scale Up/Down
          </Menu.Item>

          {!(isPaused || isFailed) && (
            <Menu.Item
              disabled={!actionAccessible || !(isRunning || isError || isWarning)}
              data-mp-event="Pause Changefeed Clicked"
              onClick={() => handlePause(changefeed)}
            >
              Pause
            </Menu.Item>
          )}
          {(isPaused || isFailed) && (
            <Menu.Item
              disabled={!actionAccessible || !(isPaused || isFailed)}
              data-mp-event="Resume Changefeed Clicked"
              onClick={() => handleResume(changefeed)}
            >
              Resume
            </Menu.Item>
          )}
          <Menu.Item
            disabled={!actionAccessible || !canEditChangefeed(changefeed)}
            data-mp-event="Edit Changefeed Clicked"
            onClick={() => history.push(`/tidbs/${cluster.tidbId}/changefeed/edit?id=${changefeed.changefeed_id}`)}
          >
            Edit
          </Menu.Item>
          {cluster.computed.isEssentialV2 && changefeed.status !== ConsoleapiChangefeedStatus.CREATING && (
            <Menu.Item
              disabled={!actionAccessible}
              data-mp-event="Duplicate Changefeed Clicked"
              onClick={() => {
                history.push(`/tidbs/${cluster.tidbId}/changefeed/create?from_id=${changefeed.changefeed_id}`)
              }}
            >
              Duplicate
            </Menu.Item>
          )}
          <Menu.Item
            disabled={!actionAccessible}
            onClick={() => handleDelete(changefeed)}
            data-mp-event="Delete Changefeed Clicked"
          >
            Delete
          </Menu.Item>
        </Menu.Dropdown>
      </Menu>

      {ConfirmModal}
    </>
  )
}
