/**
 * Structural mirror of `HarnessTimeline*` in collector/src/adapters/harness.ts — the
 * `forensics:<runId>` panel's `data` shape (`{ tiles, attribution, runs, segments }`).
 * Duplicated locally (not imported) because `collector` sits outside the pnpm
 * workspace glob (`apps/*`, `packages/*`) and cannot be depended on.
 */
export interface ForensicsTile {
  key: string
  label: string
  value: number
}

/** Bucket taxonomy cat values, exactly as emitted by the harness adapter. */
export type ForensicsBucketCat = 'llm-fixer' | 'llm-implement' | 'gate0' | 'llm-review' | 'idle-restart' | 'other'

export interface ForensicsAttribution {
  cat: string
  totalMs: number
}

export interface ForensicsRun {
  index: number
  startTs: string
  endTs: string
  durationMs: number
  outcome: string
  landed: number
  quarantined: number
  skipped: number
  gate0Fails: number
  fixerAttempts: number
}

export interface ForensicsSegment {
  t0: number
  durMs: number
  cat: string
  taskId?: string
  agentId?: string
}

export interface BucketMeta {
  label: string
  colorVar: string
}

/** Fixer / Implement / gate0 / Review / Idle / Other — the exact required bucket taxonomy. */
export const BUCKET_META: Record<ForensicsBucketCat, BucketMeta> = {
  'llm-fixer': { label: 'Fixer', colorVar: 'var(--mod-color-accent)' },
  'llm-implement': { label: 'Implement', colorVar: 'var(--mod-color-success)' },
  gate0: { label: 'gate0', colorVar: 'var(--mod-color-forensics-gate0)' },
  'llm-review': { label: 'Review', colorVar: 'var(--mod-color-warning)' },
  'idle-restart': { label: 'Idle', colorVar: 'var(--mod-color-info)' },
  other: { label: 'Other', colorVar: 'var(--mod-color-forensics-other)' },
}

const UNKNOWN_BUCKET: BucketMeta = { label: 'Unknown', colorVar: 'var(--mod-color-border-strong)' }

export function bucketMetaFor(cat: string): BucketMeta {
  return BUCKET_META[cat as ForensicsBucketCat] ?? UNKNOWN_BUCKET
}

/** Segments carry an absolute epoch-ms `t0`, not a run id — attribute each segment to
 * the run whose [startTs, endTs) window contains it. */
export function segmentsForRun(run: ForensicsRun, segments: readonly ForensicsSegment[]): ForensicsSegment[] {
  const start = Date.parse(run.startTs)
  const end = Date.parse(run.endTs)
  return segments.filter((seg) => seg.t0 >= start && seg.t0 < end)
}
