import { MRT_ColumnDef, ProTable } from '@tidbcloud/uikit/biz'
import { useMemo, useState } from 'react'

import { useCloudConfigControllerListAvailableClusterVersions } from 'apiClient/services/devops'
import { CloudconfigAvailableClusterVersion } from 'apiClient/services/devops/interface'

const DEDICATED_CLUSTER_TYPE = 'DEDICATED_TIDB'
const RELEASE_PAGE_SIZE = 10

type TablePaginationState = {
  pageIndex: number
  pageSize: number
}

type TablePaginationUpdater =
  | TablePaginationState
  | ((prev: TablePaginationState) => TablePaginationState)

const getFixedPagination = (
  updaterOrValue: TablePaginationUpdater,
  currentPagination: TablePaginationState
) => {
  const nextPagination =
    typeof updaterOrValue === 'function'
      ? updaterOrValue(currentPagination)
      : updaterOrValue

  return {
    pageIndex: nextPagination.pageIndex,
    pageSize: RELEASE_PAGE_SIZE
  }
}

function ReleaseTable() {
  const [pagination, setPagination] = useState<TablePaginationState>({
    pageIndex: 0,
    pageSize: RELEASE_PAGE_SIZE
  })
  const { data: response, isLoading } =
    useCloudConfigControllerListAvailableClusterVersions(DEDICATED_CLUSTER_TYPE)
  const data = response?.data.items || []
  const shouldPaginate = data.length > RELEASE_PAGE_SIZE
  const columns = useMemo<MRT_ColumnDef<CloudconfigAvailableClusterVersion>[]>(
    () => [
      {
        header: 'Version',
        accessorKey: 'version',
        Cell: ({ row }) => row.original.version || '-'
      },
      {
        header: 'Is Default',
        accessorKey: 'is_default',
        Cell: ({ row }) => String(!!row.original.is_default)
      }
    ],
    []
  )

  return (
    <ProTable<CloudconfigAvailableClusterVersion>
      columns={columns}
      data={data}
      enableColumnActions={false}
      enableColumnFilters={false}
      enableDensityToggle={false}
      enableFullScreenToggle={false}
      enableHiding={false}
      enablePagination={shouldPaginate}
      enableSorting={false}
      enableTopToolbar={false}
      getRowId={(row, rowIndex) =>
        [row.version, row.is_default, rowIndex].join('-')
      }
      loading={isLoading}
      onPaginationChange={(updaterOrValue) => {
        setPagination((currentPagination) =>
          getFixedPagination(updaterOrValue, currentPagination)
        )
      }}
      pagination={{ showRowsPerPage: false }}
      rowCount={shouldPaginate ? data.length : undefined}
      state={{ pagination }}
    />
  )
}

export default ReleaseTable
