Documentation
use crate::{DELIMITER, exec, expand_path, to_win_path, unix};
use which_shell::Shell;

pub fn add_path(path: &str) -> Option<Shell> {
    let abs_path = expand_path(path);
    let path_win = to_win_path(&abs_path);
    let mode = if is_admin::is_admin() {
        "Machine"
    } else {
        "User"
    };
    let shell = format!(
        r#"$currentPath = [Environment]::GetEnvironmentVariable("Path", "{mode}");$newPath = "$currentPath;{path_win}"; [Environment]::SetEnvironmentVariable("Path", $newPath, "{mode}")"#,
    );

    if exec("powershell", ["-c", &shell]) {
        let mut env_path = std::env::var("PATH").unwrap_or_default();
        env_path.push(DELIMITER);
        env_path.push_str(&abs_path);

        unsafe { std::env::set_var("PATH", env_path) };
        if let Some(sh) = unix::add_path(&abs_path) {
            return Some(sh);
        }
        return Some(Shell::PowerShell);
    }
    None
}

#[cfg(test)]
mod test {
    use super::add_path;

    #[test]
    fn test_add_path() {
        let s = "c:/xxx";
        let s = add_path(s);
        assert!(s.is_some());
    }
}