use std::time::Instant;

pub struct TimeStep {
	last_frame_time: Instant,
	// Milliseconds
	accum: u128,
	fps_num: u16,
	fps_den: u16,
}

impl TimeStep {
	pub fn new (fps_num: u16, fps_den: u16) -> Self {
		Self {
			last_frame_time: Instant::now (),
			accum: 0,
			fps_num,
			fps_den,
		}
	}
	
	// Automatically gets monotonic system time from Instant
	// If you need something fancy just rewrite this.
	// Returns: How many logics steps to run. Typically 0 or 1.
	
	pub fn step (&mut self) -> u16 {
		let frame_time = Instant::now ();
		
		let fps_num_128: u128 = self.fps_num.into ();
		let fps_den_128: u128 = self.fps_den.into ();
		
		self.accum += (frame_time - self.last_frame_time).as_millis () * fps_num_128;
		
		let mut result = 0;
		const MAX_FRAMES: u16 = 4;
		
		for _ in 0..MAX_FRAMES {
			if self.accum > fps_den_128 {
				result += 1;
				self.accum -= fps_den_128;
			}
			else {
				break;
			}
		}
		
		self.last_frame_time = frame_time;
		result
	}
}
