import { ActionIcon, HoverCard, Loader, Typography, notifier } from '@tidbcloud/uikit'
import { IconDownload01 } from '@tidbcloud/uikit/icons'
import { useEffect, useMemo, useRef, useState } from 'react'

import { useSubmitAppDownloadLogTask, useGetAppLogDownloadLinkByTaskId } from 'dbaas/services/dataservice'

type LogParams = {
  start: number
  end: number
  status: string
  type: string
  request_id: string
  endpoint_id: number | string
  cluster_id: string
}

interface LogProps extends LogParams {
  orgId: string
  projectId: string
  appId: string
}

const LogActions = ({ orgId, projectId, appId, ...reset }: LogProps) => {
  const downloadLogsTimer = useRef<ReturnType<typeof setTimeout>>()
  const downloadMutation = useSubmitAppDownloadLogTask()
  const [taskId, setTaskId] = useState('')
  const { status: downloadStatus } = useGetAppLogDownloadLinkByTaskId(orgId, projectId, appId, taskId, {
    query: {
      enabled: !!(orgId && projectId && appId && taskId),
      refetchInterval: 1000,
      refetchOnWindowFocus: false,
      onSettled: () => {
        setTaskId('')
      },
      onSuccess: (data) => {
        if (data.download_url) {
          window.location.href = data.download_url
        } else if (data.status === 'failed') {
          notifier.error(data.message ?? 'download error!')
        }
      }
    }
  })

  useEffect(() => {
    return () => {
      downloadLogsTimer.current && clearTimeout(downloadLogsTimer.current)
    }
  }, [])

  const isLoading = useMemo(
    () => downloadStatus === 'loading' || downloadMutation.isLoading,
    [downloadStatus, downloadMutation.isLoading]
  )

  const downloadLogs = async () => {
    const downloadTask = await downloadMutation.mutateAsync({
      orgId,
      projectId,
      appId,
      params: {
        ...reset
      }
    })

    if (!downloadTask.task_id) {
      notifier.error(downloadTask.message)
      return
    }

    setTaskId(downloadTask.task_id)
  }

  return (
    <HoverCard width={350} shadow="md">
      <HoverCard.Target>
        <ActionIcon aria-label="Download Logs" variant="subtle" onClick={downloadLogs}>
          {isLoading ? <Loader size={16} /> : <IconDownload01 size={16} />}
        </ActionIcon>
      </HoverCard.Target>
      <HoverCard.Dropdown>
        <Typography variant="body-lg">
          Download log files, arranged from most recent to oldest, for up to a maximum of 30 days with a limit of 10,000
          logs.
        </Typography>
      </HoverCard.Dropdown>
    </HoverCard>
  )
}

export default LogActions
