export interface CycleDatum {
  observed_ct_sec: number | null
}

export interface HistogramBin {
  bin_start: number
  bin_end: number
  bin_label: string
  count: number
}

export function computeCycleHistogram(data: CycleDatum[], binWidth: number): HistogramBin[] {
  const values = data
    .map((d) => d.observed_ct_sec)
    .filter((v): v is number => v != null && Number.isFinite(v))
  if (values.length === 0) return []

  const max = Math.max(...values)
  const bins = new Map<number, HistogramBin>()
  for (const v of values) {
    const bin_start = Math.floor(v / binWidth) * binWidth
    const existing = bins.get(bin_start) ?? {
      bin_start,
      bin_end: bin_start + binWidth,
      bin_label: `${bin_start}-${bin_start + binWidth}`,
      count: 0,
    }
    existing.count += 1
    bins.set(bin_start, existing)
  }

  const result: HistogramBin[] = []
  for (let s = 0; s <= max; s += binWidth) {
    result.push(bins.get(s) ?? {
      bin_start: s,
      bin_end: s + binWidth,
      bin_label: `${s}-${s + binWidth}`,
      count: 0,
    })
  }
  return result
}
