use std::io::{Write, stdout};
use crossterm::{
cursor::{Hide, Show},
event::{self, Event},
execute,
terminal::{Clear, ClearType, EnterAlternateScreen, LeaveAlternateScreen},
};
use tixel::{BrailleCanvas, Color};
use crate::party::fireworks::sim::Sim;
const POLL_TIME: std::time::Duration = std::time::Duration::from_millis(10);
pub fn run(colors: &[Color]) -> anyhow::Result<()> {
let mut stdout = stdout();
execute!(stdout, Hide, EnterAlternateScreen)?;
crossterm::terminal::enable_raw_mode()?;
execute!(stdout, Clear(ClearType::All))?;
let (cols, rows) = crossterm::terminal::size()?;
let mut canvas = BrailleCanvas::new((rows as usize, cols as usize), (0, 0));
let height = canvas.height() as f64;
let width = canvas.width() as f64;
let mut sim = Sim::new(width, height);
let mut time = std::time::Instant::now();
loop {
if event::poll(POLL_TIME)? {
let event = event::read()?;
if matches!(event, Event::Key(_)) {
break;
}
}
let dt = time.elapsed();
time = std::time::Instant::now();
let has_visible_particles = sim.update(dt.as_secs_f64());
for p in sim.particles() {
canvas.set_f(p.x, height - p.y, colors[p.color_idx % colors.len()]);
}
let output = canvas.render();
let _ = stdout.write_all(output.as_bytes());
if !has_visible_particles {
break;
}
}
execute!(stdout, Show, LeaveAlternateScreen)?;
crossterm::terminal::disable_raw_mode()?;
Ok(())
}