use std::iter;
use image::Rgb;
use std::ops::Index;
pub static BMP_MAGIC: &[u8] = &[0x42, 0x4D];
pub static ICO_MAGIC: &[u8] = &[0x00, 0x00, 0x01, 0x00];
pub static GIF_MAGIC: &[u8] = &[0x47, 0x49, 0x46, 0x38];
pub static PNG_MAGIC: &[u8] = &[0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];
pub static JPEG_MAGIC: &[u8] = &[0xFF, 0xD8, 0xFF, 0xE0];
pub static ANSI_COLOURS_WHITE_BG: [Rgb<u8>; 16] = [Rgb([0xEE, 0xE8, 0xD5]),
Rgb([0xDC, 0x32, 0x2F]),
Rgb([0x85, 0x99, 0x00]),
Rgb([0xB5, 0x89, 0x00]),
Rgb([0x26, 0x8B, 0xD2]),
Rgb([0xD3, 0x36, 0x82]),
Rgb([0x2A, 0xA1, 0x98]),
Rgb([0x07, 0x36, 0x42]),
Rgb([0xFD, 0xF6, 0xE3]),
Rgb([0xCB, 0x4B, 0x16]),
Rgb([0x93, 0xA1, 0xA1]),
Rgb([0x83, 0x94, 0x96]),
Rgb([0x65, 0x7B, 0x83]),
Rgb([0x6C, 0x71, 0xC4]),
Rgb([0x58, 0x6E, 0x75]),
Rgb([0x00, 0x2B, 0x36])];
pub static ANSI_COLOURS_BLACK_BG: [Rgb<u8>; 16] = [Rgb([0x00, 0x00, 0x00]),
Rgb([0xCD, 0x00, 0x00]),
Rgb([0x00, 0xCD, 0x00]),
Rgb([0xCD, 0xCD, 0x00]),
Rgb([0x00, 0x00, 0xEE]),
Rgb([0xCD, 0x00, 0xCD]),
Rgb([0x00, 0xCD, 0xCD]),
Rgb([0xE6, 0xE6, 0xE6]),
Rgb([0x80, 0x80, 0x80]),
Rgb([0xFF, 0x00, 0x00]),
Rgb([0x00, 0xFF, 0x00]),
Rgb([0xFF, 0xFF, 0x00]),
Rgb([0x5C, 0x5C, 0xFF]),
Rgb([0xFF, 0x00, 0xFF]),
Rgb([0x00, 0xFF, 0xFF]),
Rgb([0xFF, 0xFF, 0xFF])];
pub static ANSI_COLOUR_ESCAPES: [&str; 16] = ["\x1B[0;30m",
"\x1B[0;31m",
"\x1B[0;32m",
"\x1B[0;33m",
"\x1B[0;34m",
"\x1B[0;35m",
"\x1B[0;36m",
"\x1B[0;37m",
"\x1B[1;30m",
"\x1B[1;31m",
"\x1B[1;32m",
"\x1B[1;33m",
"\x1B[1;34m",
"\x1B[1;35m",
"\x1B[1;36m",
"\x1B[1;37m"];
pub static ANSI_BG_COLOUR_ESCAPES: [&str; 8] = ["\x1B[40m", "\x1B[41m", "\x1B[42m", "\x1B[43m", "\x1B[44m", "\x1B[45m", "\x1B[46m", "\x1B[47m"];
pub static ANSI_RESET_ATTRIBUTES: &str = "\x1B[0m";
pub fn mul_str(what: &str, n: usize) -> String {
iter::repeat(what).take(n).collect()
}
pub fn closest_colour<P: Index<usize, Output = u8>>(to: Rgb<u8>, out_of: &[P]) -> usize {
let mut diffs = out_of.iter()
.enumerate()
.map(|(i, rgb)| {
let r = (rgb[0] as f32 + to[0] as f32) / 2.0;
((2.0 + (r / 256.0)) * (rgb[0] as f32 - to[0] as f32).powi(2) + 4.0 * (rgb[1] as f32 - to[1] as f32).powi(2) +
(2.0 + ((255.0 - r) / 256.0)) * (rgb[2] as f32 - to[2] as f32).powi(2),
i)
})
.collect::<Vec<_>>();
diffs.sort_by(|&(lhs_diff, _), &(rhs_diff, _)| lhs_diff.partial_cmp(&rhs_diff).unwrap());
diffs[0].1
}
#[inline(always)]
pub fn bg_colours_for<C: Index<usize, Output = u8>>(foreground_colours: &[C]) -> &[C] {
&foreground_colours[0..8]
}