use std::fmt;

const MINUTES_PER_HOUR: i32 = 60;
const HOURS_PER_DAY: i32 = 24;
const MINUTES_PER_DAY: i32 = MINUTES_PER_HOUR * HOURS_PER_DAY;

#[derive(Debug, PartialEq)]
pub struct Clock {
	minutes: i32,
}

impl Clock {
	pub fn new(hours: i32, minutes: i32) -> Self {
		Self {
			minutes: (hours * MINUTES_PER_HOUR + minutes).rem_euclid(MINUTES_PER_DAY),
		}
	}

	pub fn add_minutes(&self, minutes: i32) -> Self {
		Self::new(0, self.minutes + minutes)
	}

	fn minutes(&self) -> i32 {
		self.minutes % MINUTES_PER_HOUR
	}

	fn hours(&self) -> i32 {
		self.minutes / MINUTES_PER_HOUR
	}
}

impl fmt::Display for Clock {
	fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
		write!(formatter, "{:02}:{:02}", self.hours(), self.minutes())
	}
}