///|
/// Dashboard provides a visual representation of the RelayQueue state.
pub struct Dashboard[T] {
  queue : RelayQueue[T]
  backend : InMemoryBackend[T]
}

///|
/// new creates a new dashboard for the provided queue and backend.
pub fn[T] Dashboard::new(
  queue : RelayQueue[T],
  backend : InMemoryBackend[T],
) -> Dashboard[T] {
  { queue, backend }
}

///|
/// render prints an ANSI color-coded snapshot of the current queue state.
pub fn[T] Dashboard::render(self : Dashboard[T]) -> Unit {
  let main_size = self.queue.size()
  let dlq_size = self.backend.dlq_size()
  let in_flight = self.backend.in_flight.length()

  println("\u001b[2J\u001b[H") // Clear screen and reset cursor
  println("\u001b[1;36m=== RELAY MESSAGE QUEUE DASHBOARD ===\u001b[0m")
  println("\u001b[33mStatus: \u001b[32mRUNNING\u001b[0m")
  println("-------------------------------------")
  println("\u001b[1mMain Queue:\u001b[0m    \{main_size} messages")
  println("\u001b[1mIn-Flight:\u001b[0m     \{in_flight} messages")
  println("\u001b[1;31mDead Letters:\u001b[0m  \{dlq_size} messages")
  println("-------------------------------------")
  println("\u001b[90mLast Update: real-time snapshot\u001b[0m")
}

///|
/// start_auto_render starts an infinite loop of rendering.
pub fn[T] Dashboard::start_auto_render(self : Dashboard[T]) -> Unit {
  for ;; {
    self.render()
  }
}