Documentation
use std::sync::LazyLock;
use vn::CharacterField::*;
use vn::{CharacterId, Vndb};

const YUKARI: &str = "Kaburagi Yukari";
const YUKARI_JP: &str = "鏑木 紫";

static YUKARI_ID: LazyLock<CharacterId> = LazyLock::new(|| {
  let id = format!("{}{}", CharacterId::PREFIX, 81501);
  CharacterId::new(&id).unwrap()
});

#[tokio::test]
async fn get_character() {
  let vndb = Vndb::new();
  let filters = r#"["id", "=", "c81501"]"#;
  let character = vndb
    .post()
    .character()
    .filters(filters.try_into().unwrap())
    .fields([
      Name,
      Original,
      ImageUrl,
      Description,
      VisualNovelAliases,
      VisualNovelAltTitle,
      VisualNovelTitle,
    ])
    .results(5)
    .send()
    .await
    .unwrap();

  let character = character
    .iter()
    .find(|it| {
      it.name
        .as_deref()
        .unwrap()
        .eq_ignore_ascii_case(YUKARI)
    })
    .unwrap();

  let name = character.name.as_deref().unwrap();
  assert_eq!(&character.id, &*YUKARI_ID);
  assert!(name.eq_ignore_ascii_case(YUKARI));
  assert_eq!(character.original.as_deref(), Some(YUKARI_JP));
}

#[tokio::test]
async fn find_character() {
  let character = Vndb::new()
    .find_character(&*YUKARI_ID)
    .fields([Name, Original])
    .send()
    .await
    .unwrap()
    .pop_front()
    .unwrap();

  assert_eq!(&character.id, &*YUKARI_ID);
  assert_eq!(character.name.as_deref(), Some(YUKARI));
  assert_eq!(character.original.as_deref(), Some(YUKARI_JP));
}

#[tokio::test]
async fn search_character() {
  let character = Vndb::new()
    .search_character(YUKARI.to_ascii_uppercase())
    .fields([Name, Original])
    .send()
    .await
    .unwrap()
    .into_iter()
    .find(|it| &it.id == &*YUKARI_ID)
    .unwrap();

  assert_eq!(character.name.as_deref(), Some(YUKARI));
  assert_eq!(character.original.as_deref(), Some(YUKARI_JP));
}