import { PropertyCard } from '@tidbcloud/uikit/biz'

import { humanByteSize } from 'common/services/prommetric'
import { DataFormatDisplayName, DataSourceTypeDisplayName } from 'dbaas/features/Import'
import { ImportStatus } from 'dbaas/features/Import/ImportStatus'
import {
  ImportSourceTypeEnum,
  ImportStateEnum,
  Import as ServerlessImport
} from 'dbaas/services/api-clients/legacy/serverless/interface'
import { DataflowImportGetResp, DataflowImportGetRespStatus } from 'dbaas/services/dataflow/interface'
import { formatTime } from 'dbaas/utils/format'

const ServerlessImportSummary = ({ data, timezone }: { data: ServerlessImport; timezone: number }) => {
  const isLocalImport = data.creation_details?.source?.type === ImportSourceTypeEnum.LOCAL
  const totalTablesCount = data.total_tables_count ?? 0
  const bucketUri =
    data.creation_details?.source?.s3?.uri ??
    data.creation_details?.source?.gcs?.uri ??
    data.creation_details?.source?.azure_blob?.uri ??
    data.creation_details?.source?.oss?.uri
  const isCompleted = data.complete_percent === 100

  return (
    <PropertyCard title="Summary" withBorder={false} shadow="none" p={0} sx={{ flexShrink: 0 }}>
      <PropertyCard.Item label="Task ID">{data.id}</PropertyCard.Item>
      <PropertyCard.Item label="Status">
        <ImportStatus status={data.state!} error={data.message} withinPortal />
      </PropertyCard.Item>

      {isCompleted ? (
        <>
          {!isLocalImport && <PropertyCard.Item label="Tables">{totalTablesCount}</PropertyCard.Item>}
          <PropertyCard.Item label="Size">{humanByteSize(parseInt(data.total_size ?? '0'), false)}</PropertyCard.Item>
        </>
      ) : (
        !isLocalImport &&
        !!data.total_tables_count && (
          <PropertyCard.Item label="Tables Processed">{`${data.all_completed_tables?.length ?? 0}/${
            data.total_tables_count
          }`}</PropertyCard.Item>
        )
      )}

      {isLocalImport && (
        <>
          <PropertyCard.Item label="Target Table">{`${data.creation_details?.source?.local?.target_database}.${data.creation_details?.source?.local?.target_table}`}</PropertyCard.Item>
          <PropertyCard.Item label="File Name">{data.creation_details?.source?.local?.file_name}</PropertyCard.Item>
        </>
      )}

      <PropertyCard.Item label="Start Time">
        {formatTime(data.start_time!, { showSeconds: true, offset: timezone })}
      </PropertyCard.Item>

      {data.state === ImportStateEnum.COMPLETED && (
        <PropertyCard.Item label="End Time">
          {formatTime(data.complete_time!, {
            showSeconds: true,
            offset: timezone
          })}
        </PropertyCard.Item>
      )}

      {!isLocalImport && (
        <>
          <PropertyCard.Item label="Source">
            {DataSourceTypeDisplayName[data.creation_details?.source?.type!]}
          </PropertyCard.Item>
          <PropertyCard.Item label="Bucket URI">{bucketUri}</PropertyCard.Item>
          <PropertyCard.Item label="Data Format">
            {DataFormatDisplayName[data.creation_details?.import_options?.file_type!]}
          </PropertyCard.Item>
          {data.creation_details?.source?.s3?.role_arn && (
            <PropertyCard.Item label="Role ARN">{data.creation_details?.source?.s3?.role_arn}</PropertyCard.Item>
          )}
        </>
      )}

      <PropertyCard.Item label="Created By">{data.created_by}</PropertyCard.Item>
    </PropertyCard>
  )
}

export const ImportSummaryList = ({
  data,
  timezone
}: {
  data: DataflowImportGetResp | ServerlessImport
  timezone: number
}) => {
  if ('creation_details' in data) {
    return <ServerlessImportSummary data={data} timezone={timezone} />
  }

  const dedicatedImport = data as DataflowImportGetResp
  const isCompleted = dedicatedImport.completed_percent === 100
  const localImportConfig = dedicatedImport.import_create_req?.local_import_cfg

  return (
    <PropertyCard title="Summary" withBorder={false} shadow="none" p={0} sx={{ flexShrink: 0 }}>
      <PropertyCard.Item label="Task ID">{data.id}</PropertyCard.Item>
      <PropertyCard.Item label="Status">
        {<ImportStatus status={dedicatedImport.status} error={dedicatedImport.message} withinPortal />}
      </PropertyCard.Item>

      {isCompleted ? (
        <>
          {!localImportConfig && (
            <PropertyCard.Item label="Tables">{dedicatedImport.total_tables_count}</PropertyCard.Item>
          )}
          <PropertyCard.Item label="Size">
            {humanByteSize(parseInt(dedicatedImport.total_size ?? '0'), false)}
          </PropertyCard.Item>
        </>
      ) : (
        !localImportConfig &&
        !!dedicatedImport.total_tables_count && (
          <PropertyCard.Item label="Tables Processed">{`${dedicatedImport.completed_tables}/${dedicatedImport.total_tables_count}`}</PropertyCard.Item>
        )
      )}

      {localImportConfig && (
        <>
          <PropertyCard.Item label="Target Table">{`${localImportConfig.target_table?.schema}.${localImportConfig.target_table?.table}`}</PropertyCard.Item>
          <PropertyCard.Item label="File Name">{localImportConfig.original_file_name}</PropertyCard.Item>
        </>
      )}

      <PropertyCard.Item label="Start Time">
        {formatTime(dedicatedImport.created_at, { showSeconds: true, offset: timezone })}
      </PropertyCard.Item>

      {dedicatedImport.status === DataflowImportGetRespStatus.COMPLETED && (
        <PropertyCard.Item label="End Time">
          {formatTime(new Date(dedicatedImport.created_at).valueOf() / 1000 + dedicatedImport.elapsed_time_seconds, {
            showSeconds: true,
            offset: timezone
          })}
        </PropertyCard.Item>
      )}

      {!localImportConfig && (
        <>
          <PropertyCard.Item label="Source">
            {DataSourceTypeDisplayName[dedicatedImport.import_create_req?.data_source_type!]}
          </PropertyCard.Item>
          <PropertyCard.Item label="Bucket URI">{dedicatedImport.import_create_req?.source_url}</PropertyCard.Item>
          <PropertyCard.Item label="Data Format">
            {DataFormatDisplayName[dedicatedImport.import_create_req?.data_format!]}
          </PropertyCard.Item>

          {dedicatedImport.import_create_req?.aws_role_arn && (
            <PropertyCard.Item label="Role ARN">{dedicatedImport.import_create_req?.aws_role_arn}</PropertyCard.Item>
          )}
        </>
      )}

      {dedicatedImport.created_by && (
        <PropertyCard.Item label="Created By">{dedicatedImport.created_by}</PropertyCard.Item>
      )}
    </PropertyCard>
  )
}
