import { useId, type JSX, type ReactNode } from 'react'
import { useDeckTooltip } from './DeckTooltip'
import { formatRelativeTime } from './format'

export interface ProjectGroupSummary { key: string; label: string; plans: number; running: number; needYou: number; failed: number; lastActivityMs: number | null }
export type ProjectGroupColumnKey = 'label' | 'plans' | 'running' | 'needYou' | 'failed' | 'lastActivityMs'

function MetricChip(props: { value: number; label: string; className?: string }): JSX.Element | null {
  if (props.value === 0) return null
  return <span className={`w-fit whitespace-nowrap rounded-full border border-border bg-surface-raised px-2 py-0.5 text-[10px] font-semibold tabular-nums text-fg-muted ${props.className ?? ''}`}>{props.value} {props.label}</span>
}

export function ProjectGroupRow(props: { group: ProjectGroupSummary; expanded: boolean; onToggle(): void; children?: ReactNode }): JSX.Element {
  const detailId = useId()
  const hasActivity = props.group.lastActivityMs !== null && Number.isFinite(props.group.lastActivityMs)
  const absolute = hasActivity ? new Date(props.group.lastActivityMs!).toISOString() : ''
  const tooltip = useDeckTooltip(absolute, 'Last recorded project activity')
  return <section data-testid="project-group-row" data-project-key={props.group.key} className="bg-surface hover:bg-surface-raised"><div className="relative flex flex-wrap items-center gap-2 px-3 py-2">{props.group.needYou > 0 && <span data-testid="project-severity-stripe" aria-hidden="true" className="absolute inset-y-0 left-0 w-[3px] bg-warning" />}<button type="button" aria-expanded={props.expanded} aria-controls={detailId} aria-label={`${props.expanded ? 'Collapse' : 'Expand'} ${props.group.label}`} onClick={props.onToggle} className="flex min-h-11 max-w-full items-center gap-2 font-semibold text-fg focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"><span aria-hidden="true" className={`shrink-0 text-fg-subtle transition-transform ${props.expanded ? 'rotate-90' : ''}`}>▸</span><span className="truncate">{props.group.label}</span></button><MetricChip value={props.group.plans} label="plans" /><MetricChip value={props.group.running} label="running" className="border-accent/40 bg-accent/10 text-accent" /><MetricChip value={props.group.needYou} label="need you" className="border-warning/40 bg-warning/10 text-warning" /><MetricChip value={props.group.failed} label="failed" className="border-danger/40 bg-danger/10 text-danger" /><span className="whitespace-nowrap text-xs text-fg-subtle" {...(hasActivity ? tooltip : {})}>last activity {hasActivity ? formatRelativeTime(props.group.lastActivityMs!) : '—'}</span></div>{props.expanded && <div id={detailId}>{props.children}</div>}</section>
}
