import { Badge, type BadgeVariant } from '@astryxdesign/core'
import type { JSX } from 'react'

export type PlanStatusCategory = 'needs-you' | 'failed' | 'running' | 'queued' | 'completed' | 'unknown'

const STATUS_CATEGORY: Record<string, PlanStatusCategory> = {
  attention: 'needs-you',
  blocked: 'needs-you',
  'needs-you': 'needs-you',
  paused: 'needs-you',
  degraded: 'failed',
  error: 'failed',
  failed: 'failed',
  fail: 'failed',
  incomplete: 'failed',
  interrupted: 'failed',
  killed: 'failed',
  executing: 'running',
  running: 'running',
  gated: 'queued',
  queued: 'queued',
  completed: 'completed',
  success: 'completed',
  pass: 'completed',
  converged: 'completed',
  drifted: 'needs-you',
  done: 'completed',
  succeeded: 'completed',
  healthy: 'completed',
  reachable: 'completed',
  stale: 'needs-you',
  stalled: 'needs-you',
  ok: 'completed',
  absent: 'queued',
  warn: 'needs-you',
  notice: 'queued',
  info: 'queued',
  down: 'failed',
}

/** Maps a status category to the badge variant that carries its color. */
export function statusCategoryBadgeVariant(category: PlanStatusCategory): BadgeVariant {
  switch (category) {
    case 'needs-you':
      return 'warning'
    case 'failed':
      return 'error'
    case 'running':
    case 'completed':
      return 'success'
    case 'queued':
    case 'unknown':
      return 'neutral'
  }
}

export function planStatusCategory(status: string, needsYou = false): PlanStatusCategory {
  if (needsYou) return 'needs-you'
  return STATUS_CATEGORY[status.trim().toLowerCase()] ?? 'unknown'
}

export function StatusChip(props: { status: string; needsYou?: boolean; label?: string }): JSX.Element {
  const category = planStatusCategory(props.status, props.needsYou)
  return (
    <Badge
      data-testid="status-chip"
      data-status-category={category}
      variant={statusCategoryBadgeVariant(category)}
      label={props.label ?? (props.needsYou ? 'needs you' : props.status)}
      className="w-fit shrink-0 whitespace-nowrap"
    />
  )
}