///|
let indexed_color_mapping : Array[String] = [
  "000000", "FFFFFF", "FF0000", "00FF00", "0000FF", "FFFF00", "FF00FF", "00FFFF",
  "000000", "FFFFFF", "FF0000", "00FF00", "0000FF", "FFFF00", "FF00FF", "00FFFF",
  "800000", "008000", "000080", "808000", "800080", "008080", "C0C0C0", "808080",
  "9999FF", "993366", "FFFFCC", "CCFFFF", "660066", "FF8080", "0066CC", "CCCCFF",
  "000080", "FF00FF", "FFFF00", "00FFFF", "800080", "800000", "008080", "0000FF",
  "00CCFF", "CCFFFF", "CCFFCC", "FFFF99", "99CCFF", "FF99CC", "CC99FF", "FFCC99",
  "3366FF", "33CCCC", "99CC00", "FFCC00", "FF9900", "FF6600", "666699", "969696",
  "003366", "339966", "003300", "333300", "993300", "993366", "333399", "333333",
  "000000", "FFFFFF",
]

///|
let default_theme_colors : Array[String] = [
  "FFFFFF", "000000", "EEECE1", "1F497D", "4F81BD", "C0504D", "9BBB59", "8064A2",
  "4BACC6", "F79646",
]

///|
fn normalize_rgb_hex(value : StringView) -> String {
  let text = value.to_owned()
  match text.strip_prefix("FF") {
    Some(rest) if text.length() == 8 => rest.to_owned()
    _ => text
  }
}

///|
pub fn Workbook::get_base_color(
  self : Workbook,
  hex_color : String,
  indexed_color : Int,
  theme_color? : Int,
) -> String {
  let theme_colors = self.theme_colors.unwrap_or(default_theme_colors)
  match theme_color {
    Some(value) =>
      if value >= 0 && value < theme_colors.length() {
        return theme_colors[value]
      }
    None => ()
  }
  let normalized_hex = normalize_rgb_hex(hex_color)
  if normalized_hex.length() == 6 {
    return normalized_hex
  }
  match self.indexed_colors {
    Some(colors) =>
      if indexed_color >= 0 && indexed_color < colors.length() {
        return colors[indexed_color]
      }
    None => ()
  }
  if indexed_color >= 0 && indexed_color < indexed_color_mapping.length() {
    return indexed_color_mapping[indexed_color]
  }
  normalized_hex
}