use std::borrow::Borrow;
use crate::types::students::student::StudentImageData;
use super::{
internal::{fetch_response, Endpoint},
BlueArchiveError, Client, IteratorRandom, Language, Result, Student, StudentFilterOptions,
};
pub async fn fetch_all_students(
language: impl Borrow<Language>,
) -> Result<Vec<Student>, BlueArchiveError> {
let client = Client::new();
let mut students = fetch_response(&Endpoint::Students, language.borrow(), &client)
.await?
.json::<Vec<Student>>()
.await?;
students
.iter_mut()
.for_each(|student| student.image = StudentImageData::new(student));
Ok(students)
}
pub async fn fetch_student_by_name(
name: impl AsRef<str>,
language: impl Borrow<Language>,
) -> Result<Option<Student>, BlueArchiveError> {
let mut matched_student = None;
for student in fetch_all_students(language).await? {
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 async fn fetch_random_student(
language: impl Borrow<Language>,
) -> Result<Option<Student>, BlueArchiveError> {
Ok(fetch_all_students(language)
.await?
.into_iter()
.choose(&mut rand::thread_rng()))
}
pub async fn fetch_random_students(
language: impl Borrow<Language>,
amount: usize,
) -> Result<Vec<Student>, BlueArchiveError> {
Ok(fetch_all_students(language)
.await?
.into_iter()
.choose_multiple(&mut rand::thread_rng(), amount))
}
pub fn filter(students: &Vec<Student>) -> StudentFilterOptions {
StudentFilterOptions::new(students)
}