use lemmy_utils::error::LemmyErrorType;
use std::{env::current_dir, process::Command};
use strum::IntoEnumIterator;

#[test]
#[allow(clippy::unwrap_used)]
fn test_errors_used() {
  let mut unused_error_found = false;
  let mut current_dir = current_dir().unwrap();
  current_dir.pop();
  current_dir.pop();
  for error in LemmyErrorType::iter() {
    let search = format!("LemmyErrorType::{error}");
    let mut grep_all = Command::new("grep");
    let grep_all = grep_all
      .current_dir(current_dir.clone())
      .arg("-R")
      .arg("--exclude=error.rs")
      .arg(&search)
      .arg("crates/")
      .arg("src/");
    let output = grep_all.output().unwrap();
    let grep_all_out = std::str::from_utf8(&output.stdout).unwrap();

    let mut grep_apub = Command::new("grep");
    let grep_apub = grep_apub
      .current_dir(current_dir.clone())
      .arg("-R")
      .arg("--exclude-dir=api")
      .arg(&search)
      .arg("crates/apub/");
    let output = grep_apub.output().unwrap();
    let grep_apub_out = std::str::from_utf8(&output.stdout).unwrap();

    if grep_all_out.is_empty() {
      println!("LemmyErrorType::{} is unused", error);
      unused_error_found = true;
    }
    if search != "LemmyErrorType::FederationError" && grep_all_out == grep_apub_out {
      println!("LemmyErrorType::{} is only used for federation", error);
      unused_error_found = true;
    }
  }
  assert!(!unused_error_found);
}
