use std::borrow::Borrow;
use rand::seq::IteratorRandom;
use crate::{
filter::student::StudentFilterOptions,
types::{students::student::StudentImageData, Student},
Language,
};
use super::{
internal::{get_response, Endpoint},
BlueArchiveError, Client, Result,
};
pub fn get_all_students(language: impl Borrow<Language>) -> Result<Vec<Student>, BlueArchiveError> {
let client = Client::new();
let mut students =
get_response(&Endpoint::Students, language.borrow(), &client)?.json::<Vec<Student>>()?;
students
.iter_mut()
.for_each(|student| student.image = StudentImageData::new(student));
Ok(students)
}
pub fn get_student_by_name(
name: impl AsRef<str>,
language: impl Borrow<Language>,
) -> Result<Option<Student>, BlueArchiveError> {
let mut matched_student = None;
for student in get_all_students(language)? {
let lowercased = name.as_ref().to_lowercase();
let maybe_student = (lowercased == student.name.to_lowercase()
|| lowercased == student.first_name.to_lowercase()
|| lowercased == student.last_name.to_lowercase()
|| lowercased == student.full_name_last().to_lowercase()
|| lowercased == student.full_name_first().to_lowercase())
.then_some(student);
if let Some(student) = maybe_student {
matched_student = Some(student);
break;
}
}
Ok(matched_student)
}
pub fn get_random_student(
language: impl Borrow<Language>,
) -> Result<Option<Student>, BlueArchiveError> {
Ok(get_all_students(language)?
.into_iter()
.choose(&mut rand::thread_rng()))
}
pub fn get_random_students(
language: impl Borrow<Language>,
amount: usize,
) -> Result<Vec<Student>, BlueArchiveError> {
Ok(get_all_students(language)?
.into_iter()
.choose_multiple(&mut rand::thread_rng(), amount))
}
pub fn filter(students: &Vec<Student>) -> StudentFilterOptions {
StudentFilterOptions::new(students)
}