use crate::{error::HbdResult, files::storage::Storage, utils::date::DateAndYear};
pub fn import(
path: &str,
exit_on_duplicate: Option<bool>,
check_duplicates: Option<bool>,
) -> HbdResult<()> {
let mut storage_birthdays = Storage::read_from_json()?;
let file_content = std::fs::read_to_string(path)?;
let mut all_names = storage_birthdays
.birthdays()
.clone()
.into_iter()
.flat_map(|e| e.1)
.collect::<Vec<String>>();
for (i, line) in tqdm::tqdm(file_content.lines().enumerate()) {
let mut line_iter = line.split(' ');
let name = if let Some(name) = line_iter.next() {
if check_duplicates.unwrap_or(true) {
if all_names.iter().any(|n| n == name) {
eprintln!("Person with name `{name}` already exists");
if exit_on_duplicate.unwrap_or(false) {
std::process::exit(1)
}
}
all_names.push(name.to_owned());
}
name
} else {
exit_on_line(i, line);
};
let formatted_date = if let Some(birth_date) = line_iter.next() {
match DateAndYear::from_date_str(birth_date) {
Ok(d) => d,
Err(why) => {
eprintln!("Item at line {i} is in a bad format: `{line}`");
return Err(why);
},
}
} else {
exit_on_line(i, line);
};
if line_iter.next().is_some() {
exit_on_line(i, line);
}
if let Some(birthdays) = storage_birthdays
.birthdays
.get_mut(formatted_date.date_u16())
{
birthdays.push(name.to_owned());
} else {
storage_birthdays
.birthdays
.insert(*formatted_date.date_u16(), vec![name.to_owned()]);
}
if let Some(year) = formatted_date.year() {
storage_birthdays.ages.insert(name.to_owned(), *year);
}
}
println!("{storage_birthdays:#?}");
storage_birthdays.write_to_storage()?;
println!("All birthdays have been successfully imported!");
Ok(())
}
pub fn exit_on_line(line_index: usize, line_string: &str) -> ! {
eprintln!(
"Item at line {} is in a bad format: `{line_string}`",
line_index + 1
);
std::process::exit(1)
}