use std::fs;
use std::path::Path;
use std::path::PathBuf;
use std::process::Command;

fn main() {
    let dir = PathBuf::from("../test");
    println!("cargo:rerun-if-changed=../test");
    let firmware_path = dir.join("RELEASEAARCH64_QEMU_EFI.fd");
    if !firmware_path.exists() {
        if let Some(parent) = firmware_path.parent() {
            fs::create_dir_all(parent).expect("failed to create firmware directory");
        }

        let url = "https://retrage.github.io/edk2-nightly/bin/RELEASEAARCH64_QEMU_EFI.fd";
        if let Err(err) = fetch_with_tools(url, &firmware_path) {
            panic!(
                "failed to obtain firmware: {}\nPlease download it manually from:\n  {}\nAnd place it at: {}",
                err,
                url,
                firmware_path.display()
            );
        }
    }
}

fn fetch_with_tools(url: &str, dest: &Path) -> Result<(), String> {
    // Prefer curl if available
    if let Ok(status) = Command::new("curl")
        .arg("-L")
        .arg("-o")
        .arg(dest)
        .arg(url)
        .status()
        && status.success()
    {
        return Ok(());
    }

    // Fallback to wget
    if let Ok(status) = Command::new("wget").arg("-O").arg(dest).arg(url).status()
        && status.success()
    {
        return Ok(());
    }

    Err("neither 'curl' nor 'wget' succeeded (or were found)".into())
}