use std::path::{Path, PathBuf};
use std::process::{Command, Stdio};

pub(crate) fn get_host_triple(rustc: &Path) -> String {
    let version_info = Command::new(rustc)
        .stderr(Stdio::inherit())
        .args(["--print", "host-tuple"])
        .output()
        .unwrap()
        .stdout;
    String::from_utf8(version_info).unwrap().trim().to_owned()
}

pub(crate) fn get_toolchain_name() -> String {
    let active_toolchain = Command::new("rustup")
        .stderr(Stdio::inherit())
        .args(["show", "active-toolchain"])
        .output()
        .unwrap()
        .stdout;
    String::from_utf8(active_toolchain).unwrap().trim().split_once(' ').unwrap().0.to_owned()
}

pub(crate) fn get_cargo_path() -> PathBuf {
    if let Ok(cargo) = std::env::var("CARGO") {
        return PathBuf::from(cargo);
    }
    let cargo_path = Command::new("rustup")
        .stderr(Stdio::inherit())
        .args(["which", "cargo"])
        .output()
        .unwrap()
        .stdout;
    Path::new(String::from_utf8(cargo_path).unwrap().trim()).to_owned()
}

pub(crate) fn get_rustc_path() -> PathBuf {
    if let Ok(rustc) = std::env::var("RUSTC") {
        return PathBuf::from(rustc);
    }
    let rustc_path = Command::new("rustup")
        .stderr(Stdio::inherit())
        .args(["which", "rustc"])
        .output()
        .unwrap()
        .stdout;
    Path::new(String::from_utf8(rustc_path).unwrap().trim()).to_owned()
}

pub(crate) fn get_rustdoc_path() -> PathBuf {
    if let Ok(rustdoc) = std::env::var("RUSTDOC") {
        return PathBuf::from(rustdoc);
    }
    let rustc_path = Command::new("rustup")
        .stderr(Stdio::inherit())
        .args(["which", "rustdoc"])
        .output()
        .unwrap()
        .stdout;
    Path::new(String::from_utf8(rustc_path).unwrap().trim()).to_owned()
}

pub(crate) fn get_default_sysroot(rustc: &Path) -> PathBuf {
    let default_sysroot = Command::new(rustc)
        .stderr(Stdio::inherit())
        .args(["--print", "sysroot"])
        .output()
        .unwrap()
        .stdout;
    Path::new(String::from_utf8(default_sysroot).unwrap().trim()).to_owned()
}

// FIXME call once for each target and pass result around in struct
pub(crate) fn get_file_name(rustc: &Path, crate_name: &str, crate_type: &str) -> String {
    let file_name = Command::new(rustc)
        .stderr(Stdio::inherit())
        .args([
            "--crate-name",
            crate_name,
            "--crate-type",
            crate_type,
            "--print",
            "file-names",
            "-",
        ])
        .output()
        .unwrap()
        .stdout;
    let file_name = String::from_utf8(file_name).unwrap().trim().to_owned();
    assert!(!file_name.contains('\n'));
    assert!(file_name.contains(crate_name));
    file_name
}
