use crate::timestep::get_micros;

pub struct Profiler {
	interval_us: u64,
	last_measure_us: u64,
	frametime_sum_us: u64,
	measure_frames: u64,
	time_start_us: u64,
}

impl Profiler {
	pub fn new(interval_ms: u64) -> Self {
		Self {
			frametime_sum_us: 0,
			interval_us: interval_ms * 1000,
			last_measure_us: 0,
			measure_frames: 0,
			time_start_us: 0,
		}
	}

	pub fn start(&mut self) {
		self.time_start_us = get_micros();
	}

	pub fn end(&mut self) {
		let cur_micros = get_micros();

		let frametime = cur_micros - self.time_start_us;
		self.measure_frames += 1;
		self.frametime_sum_us += frametime;

		if self.last_measure_us + self.interval_us < cur_micros {
			log::debug!(
				"avg frametime: {:.3}ms",
				(self.frametime_sum_us / self.measure_frames) as f32 / 1000.0
			);
			self.last_measure_us = cur_micros;
			self.frametime_sum_us = 0;
			self.measure_frames = 0;
		}
	}
}
