use std::str::FromStr;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Colour {
    pub r: u8,
    pub g: u8,
    pub b: u8,
    pub a: u8,
}

impl Colour {
    pub fn from_rgb(r: u8, g: u8, b: u8, a: u8) -> Self {
        Colour { r, g, b, a }
    }

    pub fn to_rgb15(self) -> u16 {
        let (r, g, b) = (self.r as u16, self.g as u16, self.b as u16);
        ((r >> 3) & 31) | (((g >> 3) & 31) << 5) | (((b >> 3) & 31) << 10)
    }

    pub fn is_transparent(self) -> bool {
        self.a != 255
    }
}

impl FromStr for Colour {
    type Err = String;

    fn from_str(colour: &str) -> Result<Self, Self::Err> {
        if colour.len() != 6 {
            return Err(format!("Expected colour to be 6 characters, got {colour}"));
        }

        let r = u8::from_str_radix(&colour[0..2], 16).unwrap();
        let g = u8::from_str_radix(&colour[2..4], 16).unwrap();
        let b = u8::from_str_radix(&colour[4..6], 16).unwrap();

        Ok(Colour::from_rgb(r, g, b, 255))
    }
}