///|
pub(all) struct PosterPreset {
  name : String
  canvas : @core.Size
  margin : @core.EdgeInsets
} derive(Debug, Eq)

///|
fn gcd(left : Int, right : Int) -> Int {
  if right == 0 {
    left.abs()
  } else {
    gcd(right, left % right)
  }
}

///|
pub fn PosterPreset::safe_area(self : PosterPreset) -> @core.EdgeInsets {
  self.margin
}

///|
pub fn PosterPreset::aspect_ratio_label(self : PosterPreset) -> String {
  let divisor = gcd(self.canvas.width, self.canvas.height)
  let width = self.canvas.width / divisor
  let height = self.canvas.height / divisor
  width.to_string() + ":" + height.to_string()
}

///|
pub fn PosterPreset::instagram_square() -> PosterPreset {
  {
    name: "instagram-square",
    canvas: @core.Size::square(1080),
    margin: @core.EdgeInsets::all(96),
  }
}

///|
pub fn PosterPreset::youtube_thumbnail() -> PosterPreset {
  {
    name: "youtube-thumbnail",
    canvas: { width: 1280, height: 720 },
    margin: @core.EdgeInsets::all(72),
  }
}

///|
pub fn PosterPreset::social_story() -> PosterPreset {
  {
    name: "social-story",
    canvas: { width: 1080, height: 1920 },
    margin: @core.EdgeInsets::all(84),
  }
}