use crate::{
    adapted_iter::AdaptedFilesIterBox,
    adapters::{
        custom::{CustomSpawningFileAdapter, BUILTIN_SPAWNING_ADAPTERS},
        AdaptInfo, ReadBox,
    },
    config::RgaConfig,
    matching::{FastFileMatcher, FileMatcher},
    recurse::concat_read_streams,
};
use anyhow::Result;
use std::path::{Path, PathBuf};
use tokio::{fs::File, io::AsyncReadExt};

pub use pretty_assertions::{assert_eq, assert_ne};
pub fn test_data_dir() -> PathBuf {
    let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
    d.push("exampledir/test/");
    d
}

pub async fn simple_fs_adapt_info(filepath: &Path) -> Result<(AdaptInfo, FileMatcher)> {
    Ok(simple_adapt_info_full(
        filepath,
        Box::pin(File::open(filepath).await?),
        true,
    ))
}
pub fn simple_adapt_info(filepath: &Path, inp: ReadBox) -> (AdaptInfo, FileMatcher) {
    simple_adapt_info_full(filepath, inp, false)
}

pub fn simple_adapt_info_full(
    filepath: &Path,
    inp: ReadBox,
    is_real_file: bool,
) -> (AdaptInfo, FileMatcher) {
    (
        AdaptInfo {
            filepath_hint: filepath.to_owned(),
            is_real_file,
            archive_recursion_depth: 0,
            inp,
            line_prefix: "PREFIX:".to_string(),
            config: RgaConfig::default(),
            postprocess: true,
        },
        FastFileMatcher::FileExtension(
            filepath
                .extension()
                .unwrap_or_default()
                .to_string_lossy()
                .into_owned(),
        )
        .into(),
    )
}

pub async fn adapted_to_vec(adapted: AdaptedFilesIterBox) -> Result<Vec<u8>> {
    let mut res = concat_read_streams(adapted);

    let mut buf = Vec::new();
    res.read_to_end(&mut buf).await?;
    Ok(buf)
}

pub fn poppler_adapter() -> CustomSpawningFileAdapter {
    let adapter = BUILTIN_SPAWNING_ADAPTERS
        .iter()
        .find(|e| e.name == "poppler")
        .expect("no poppler adapter");

    adapter.to_adapter()
}

#[cfg(test)]
pub fn init_logging() {
    let _ = env_logger::builder().is_test(true).try_init();
}
