use std::borrow::Cow;
use crate::helper::date::*;
use crate::structs::Color;
use crate::structs::NumberingFormat;
use fancy_regex::Captures;
use fancy_regex::Matches;
use fancy_regex::Regex;
use thousands::Separable;
const DATE_FORMAT_REPLACEMENTS: &[(&str, &str)] = &[
("\\", ""),
("am/pm", "%P"),
("ggge", "%Y"),
("e", "%Y"),
("yyyy", "%Y"),
("yy", "%y"),
("mmmmm", "%b"),
("mmmm", "%B"),
("mmm", "%b"),
(":mm", ":%M"),
("mm:", "%M:"),
("mm", "MM"),
("m", "%-m"),
("MM", "%m"),
("dddd", "%A"),
("ddd", "%a"),
("dd", "D"),
("d", "%-d"),
("D", "%d"),
("ss", "%S"),
(".s", ""),
];
const DATE_FORMAT_REPLACEMENTS_24: &[(&str, &str)] = &[("hh", "%H"), ("h", "%-H")];
const DATE_FORMAT_REPLACEMENTS_12: &[(&str, &str)] = &[("hh", "%I"), ("h", "%-I")];
pub(crate) fn format_as_date<'input>(value: &f64, format: &'input str) -> Cow<'input, str> {
let format = Cow::Borrowed(format);
let re = Regex::new(r"^(\[[0-9A-Za-z]*\])*(\[\$[A-Z]*-[0-9A-F]*\])").unwrap();
let format = re.replace_all(&format, r#""#);
let re = Regex::new(r#"(?:^|")([^"]*)(?:$|")"#).unwrap();
let mut format = re.replace_all(&format, |caps: &Captures| {
let caps_string = caps.get(0).unwrap().as_str();
caps_string.to_lowercase()
});
let blocks: Vec<&str> = format.split('"').collect();
let mut converted_blocks: Vec<String> = Vec::new();
let mut i = 0;
for block in blocks {
let mut block = block.to_string();
if i % 2 == 0 {
for (before, after) in DATE_FORMAT_REPLACEMENTS {
block = block.replace(before, after);
}
if !block.contains("%P") {
if block.contains("[h]") {
let hours = value * 24f64;
block = block.replace("[h]", &hours.to_string());
converted_blocks.push(block);
continue;
}
for (before, after) in DATE_FORMAT_REPLACEMENTS_24 {
block = block.replace(before, after);
}
} else {
for (before, after) in DATE_FORMAT_REPLACEMENTS_12 {
block = block.replace(before, after);
}
}
}
converted_blocks.push(block);
i += 1;
}
format = Cow::Owned(converted_blocks.join(r#""#));
let re = Regex::new(r#""(.*)""#).unwrap();
let format = re.replace_all(&format, |caps: &Captures| {
let caps_string = caps.get(0).unwrap().as_str();
caps_string.to_lowercase()
});
let date_obj = excel_to_date_time_object(value, None);
Cow::Owned(date_obj.format(&format).to_string())
}