import { Tag } from 'antd'
import type { ColumnsType } from 'antd/lib/table'
import { useMemo } from 'react'

import { useAgentServiceListSecretStoreSecrets } from 'apiClient/services/agent-gateway'
import type {
  V1Secret,
  V1SecretSource,
  V1SecretState
} from 'apiClient/services/agent-gateway/interface'

import {
  DetailFields,
  DetailJSON,
  ResourcePageProps,
  ResourceTable,
  formatResourceTime
} from '../resources'

const stateColors: Record<V1SecretState, string> = {
  SECRET_STATE_UNSPECIFIED: 'default',
  SECRET_STATE_LOADING: 'processing',
  SECRET_STATE_READY: 'success',
  SECRET_STATE_STALE: 'warning',
  SECRET_STATE_UNAVAILABLE: 'error'
}

function secretState(state?: V1SecretState) {
  return state ? (
    <Tag color={stateColors[state]}>{state.replace('SECRET_STATE_', '')}</Tag>
  ) : (
    '—'
  )
}

function sourceType(source?: V1SecretSource) {
  if (source?.awsSecretsManager) return 'AWS Secrets Manager'
  if (source?.o11yExchange) return 'O11y Exchange'
  if (source?.larkTenantToken) return 'Lark Tenant Token'
  return '—'
}

const columns: ColumnsType<V1Secret> = [
  { title: 'Name', dataIndex: 'name' },
  {
    title: 'Source Type',
    key: 'source',
    render: (_, secret) => sourceType(secret.source)
  },
  {
    title: 'State',
    key: 'state',
    render: (_, secret) => secretState(secret.status?.state)
  },
  {
    title: 'Last Success At',
    key: 'lastSuccessAt',
    render: (_, secret) => formatResourceTime(secret.status?.lastSuccessAt)
  },
  {
    title: 'Expires At',
    key: 'expiresAt',
    render: (_, secret) => formatResourceTime(secret.status?.expiresAt)
  }
]

function SecretDetail({ secret }: { secret: V1Secret }) {
  return (
    <>
      <DetailFields
        title="Basic Information"
        fields={[
          ['Name', secret.name],
          ['Source Type', sourceType(secret.source)]
        ]}
      />
      <DetailJSON title="Source" value={secret.source} />
      <DetailFields
        title="Refresh"
        fields={[
          ['Interval', secret.refresh?.interval],
          ['Refresh Before Expiry', secret.refresh?.refreshBeforeExpiry],
          ['Max Staleness', secret.refresh?.maxStaleness]
        ]}
      />
      <DetailFields
        title="Status"
        fields={[
          ['State', secretState(secret.status?.state)],
          ['Version', secret.status?.version],
          ['Last Error', secret.status?.lastError],
          ['Last Attempt At', formatResourceTime(secret.status?.lastAttemptAt)],
          ['Last Success At', formatResourceTime(secret.status?.lastSuccessAt)],
          ['Expires At', formatResourceTime(secret.status?.expiresAt)]
        ]}
      />
    </>
  )
}

export default function Secrets({ active, agent }: ResourcePageProps) {
  const query = useAgentServiceListSecretStoreSecrets(agent.agentId!, {
    query: {
      enabled: active && !!agent.projectManagementEnabled,
      retry: false,
      refetchOnWindowFocus: false,
      refetchOnReconnect: false,
      keepPreviousData: false
    },
    request: { isShowMessage: false }
  })
  const secrets = useMemo(
    () =>
      [...(query.data?.data.secrets || [])].sort((left, right) =>
        left.name!.localeCompare(right.name!)
      ),
    [query.data]
  )

  return (
    <ResourceTable
      active={active}
      agent={agent}
      title="Secrets"
      columns={columns}
      records={secrets}
      loading={query.isFetching}
      failed={query.isError}
      error={query.error}
      reload={() => query.refetch()}
      recordKey={(secret) => secret.name!}
      renderDetail={(secret) => <SecretDetail secret={secret} />}
    />
  )
}
