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

import { canConfigureEventSplitting } from 'dbaas/features/Changefeed/helpers'
import { CloudProviderConst } from 'dbaas/features/Project'
import { ConsoleapiChangefeed, DataflowConnector } from 'dbaas/services/dataflow/interface'

import { DataFormatProperties } from './DataFormatProperties'
import { StartPositionProperty } from './StartPositionDisplay'
import { TableConfigProperties } from './TableFilterProperties'

interface S3PropertiesProps {
  data: DataflowConnector | ConsoleapiChangefeed
  clusterVersion: string
  cloudProvider?: string
}

const displayStorageUri = (uri?: string, isAliCloudOSS?: boolean) => {
  if (!uri || !isAliCloudOSS) {
    return uri || '-'
  }

  return uri.replace(/^s3:\/\//, 'oss://')
}

const getS3Provider = (endpoint: unknown) => {
  return endpoint && typeof endpoint === 'object' && 'provider' in endpoint
    ? (endpoint as { provider?: string }).provider
    : undefined
}

export const S3Properties = ({ data, clusterVersion, cloudProvider }: S3PropertiesProps) => {
  const outputRawChangeEvent =
    data.request?.s3_info?.data_format && 'output_raw_change_event' in data.request.s3_info.data_format
      ? data.request.s3_info.data_format.output_raw_change_event
      : false
  const isAliCloudOSS =
    cloudProvider === CloudProviderConst.ALICLOUD ||
    getS3Provider(data.request?.s3_info?.endpoint) === 'S3_PROVIDER_ALIBABA_OSS'
  const uriLabel = isAliCloudOSS ? 'OSS URI' : 'S3 URI'

  return (
    <>
      <PropertyCard.Divider />

      <PropertyCard.Item label={uriLabel}>
        {displayStorageUri(data.request?.s3_info?.endpoint?.s3Uri, isAliCloudOSS)}
      </PropertyCard.Item>

      <PropertyCard.Divider />

      <TableConfigProperties data={data.request?.s3_info?.table_config} />
      <StartPositionProperty data={data.request?.s3_info?.start_position} />

      <DataFormatProperties data={data.request?.s3_info?.data_format} />

      {canConfigureEventSplitting(clusterVersion) && (
        <PropertyCard.Item label="Output Raw Events">{outputRawChangeEvent ? 'Yes' : 'No'}</PropertyCard.Item>
      )}
    </>
  )
}
