import { Tag } from 'antd'
import moment from 'moment'

const PRECHECK_STATE_COLORS: Record<string, string> = {
  PENDING: 'default',
  RUNNING: 'processing',
  SUCCEEDED: 'success',
  FAILED: 'error'
}

const PRECHECK_STATE_LABELS: Record<string, string> = {
  PENDING: 'Pending',
  RUNNING: 'Running',
  SUCCEEDED: 'Succeeded',
  FAILED: 'Failed'
}

const REPORT_ITEM_STATUS_COLORS: Record<string, string> = {
  RISK_FOUND: 'error',
  NO_RISK_FOUND: 'success',
  NEEDS_INPUT: 'warning'
}

const REPORT_ITEM_STATUS_LABELS: Record<string, string> = {
  RISK_FOUND: 'Risk Found',
  NO_RISK_FOUND: 'No Risk Found',
  NEEDS_INPUT: 'Needs Input'
}

const CATEGORY_LABELS: Record<string, string> = {
  FEATURE_GAP: 'Feature Gap',
  MIGRATION_READINESS: 'Migration Readiness'
}

export const titleCase = (value?: string) => {
  const normalized = value || 'UNKNOWN'

  return normalized
    .split('_')
    .filter(Boolean)
    .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())
    .join(' ')
}

export const categoryLabel = (category?: string) =>
  CATEGORY_LABELS[category || ''] || titleCase(category)

export const renderPrecheckState = (state?: string) => {
  const normalized = state || 'UNKNOWN'

  return (
    <Tag color={PRECHECK_STATE_COLORS[normalized] || 'default'}>
      {PRECHECK_STATE_LABELS[normalized] || normalized}
    </Tag>
  )
}

export const renderReportItemStatus = (status?: string) => {
  const normalized = status || 'UNKNOWN'

  return (
    <Tag color={REPORT_ITEM_STATUS_COLORS[normalized] || 'default'}>
      {REPORT_ITEM_STATUS_LABELS[normalized] || normalized}
    </Tag>
  )
}

export const formatDateTime = (value?: string) =>
  value ? moment(value).local().format('YYYY-MM-DD HH:mm:ss') : '-'

export const getErrorMessage = (error: unknown, fallback: string) => {
  const requestError = error as {
    response?: { data?: { errmsg?: string; message?: string } }
    message?: string
  }

  return (
    requestError.response?.data?.errmsg ||
    requestError.response?.data?.message ||
    requestError.message ||
    fallback
  )
}
