const MAX_COORDONATE: i32 = 30000;
const MIN_COORDONATE: i32 = -30000;


#[derive(Copy, Clone, PartialEq, Debug, Eq)]
pub enum Coordinate16 {
    Absolute(i16),
    Percentage(i16),
}
impl Coordinate16 {
    pub fn is_absolute(&self) -> bool {
        match self {
            Coordinate16::Absolute(_) => true,
            Coordinate16::Percentage(_) => false,
        }
    }
    pub fn absolute(&self, parent_size: u16) -> i32 {
        match self {
            Coordinate16::Absolute(v) => (*v) as i32,
            Coordinate16::Percentage(v) => ((*v) as i32) * (parent_size as i32) / 10000i32,
        }
    }
}

impl From<i8> for Coordinate16 {
    fn from(value: i8) -> Self {
        Coordinate16::Absolute(value as i16)
    }
}
impl From<i16> for Coordinate16 {
    fn from(value: i16) -> Self {
        Coordinate16::Absolute(value.clamp(MIN_COORDONATE as i16, MAX_COORDONATE as i16))
    }
}
impl From<i32> for Coordinate16 {
    fn from(value: i32) -> Self {
        Coordinate16::Absolute(value.clamp(MIN_COORDONATE, MAX_COORDONATE) as i16)
    }
}
impl From<i64> for Coordinate16 {
    fn from(value: i64) -> Self {
        Coordinate16::Absolute(value.clamp(MIN_COORDONATE as i64, MAX_COORDONATE as i64) as i16)
    }
}
impl From<u8> for Coordinate16 {
    fn from(value: u8) -> Self {
        Coordinate16::Absolute(value as i16)
    }
}
impl From<u16> for Coordinate16 {
    fn from(value: u16) -> Self {
        Coordinate16::Absolute(value.min(MAX_COORDONATE as u16) as i16)
    }
}
impl From<u32> for Coordinate16 {
    fn from(value: u32) -> Self {
        Coordinate16::Absolute(value.min(MAX_COORDONATE as u32) as i16)
    }
}
impl From<u64> for Coordinate16 {
    fn from(value: u64) -> Self {
        Coordinate16::Absolute(value.min(MAX_COORDONATE as u64) as i16)
    }
}
impl From<f32> for Coordinate16 {
    fn from(value: f32) -> Self {
        Coordinate16::Percentage(((value * 10000.0f32) as i32).clamp(MIN_COORDONATE, MAX_COORDONATE) as i16)
    }
}

impl From<f64> for Coordinate16 {
    fn from(value: f64) -> Self {
        Coordinate16::Percentage(((value * 10000.0f64) as i32).clamp(MIN_COORDONATE, MAX_COORDONATE) as i16)
    }
}
