import { notifier } from '@tidbcloud/uikit'
import { Modal } from '@tidbcloud/uikit'
import { Form } from '@tidbcloud/uikit/biz'
import { observer } from 'mobx-react'
import { useForm } from 'react-hook-form'

import { ModalCodeTitle } from 'dbaas/components'
import { useAccessCheck } from 'dbaas/contexts/access-control'
import { useDeleteUser } from 'dbaas/services/account'
import { CentralConsoleUser } from 'dbaas/services/account/interface'
import { getErrorMessage } from 'dbaas/services/errorCodes'
import useStores from 'dbaas/stores/useStores'

interface UserDeletionModalProps {
  user: CentralConsoleUser | undefined
  opened: boolean
  onClose: () => void
  onFinish?: () => void
}

export const UserDeletionModal = observer(({ user, opened = false, onClose, onFinish }: UserDeletionModalProps) => {
  const {
    store: {
      tenantData: { id: orgId }
    }
  } = useStores()

  const accessible = useAccessCheck('OrgUsersV2Action')

  const form = useForm<{}>({
    mode: 'onChange'
  })

  const orgUserDeletionMutation = useDeleteUser({
    mutation: {
      onError: (err) => {
        notifier.error(getErrorMessage(err))
      }
    }
  })

  const handleDelete = async () => {
    if (!user) {
      return
    }

    await orgUserDeletionMutation.mutateAsync({
      orgId,
      userId: user.id || ''
    })

    onFinish?.()
    onClose()
  }

  const loading = orgUserDeletionMutation.isLoading

  return (
    <Modal
      title={
        <>
          Delete User <ModalCodeTitle>{user?.email}</ModalCodeTitle>
        </>
      }
      opened={opened}
      onClose={onClose}
      centered
      size="lg"
    >
      <Form
        form={form}
        onSubmit={handleDelete}
        onCancel={onClose}
        actionsProps={{
          confirmProps: {
            color: 'red',
            variant: 'light',
            loading,
            disabled: !accessible,
            'data-mp-event': 'Delete User Consequence Button Clicked'
          },
          confirmText: 'Delete'
        }}
      >
        Removing this user will delete all their assigned roles and access. This action can't be undone.
      </Form>
    </Modal>
  )
})
