use std::env;
use std::path::PathBuf;

use bindgen::EnumVariation;

fn main() {
    // Skip building on docs.rs, because nvtiff.h won't be available
    if std::env::var("DOCS_RS").is_ok() {
        return;
    }
    // Tell cargo to tell rustc to link the system nvtiff shared library.
    println!("cargo:rustc-link-lib=nvtiff");

    // The bindgen::Builder is the main entry point to bindgen, and lets you build up
    // options for the resulting bindings.
    let bindings = bindgen::Builder::default()
        // The input header we would like to generate bindings for.
        .header("wrapper.h")
        .clang_arg("-I/usr/local/cuda/include") // Path to cuda_runtime.h
        // Tell cargo to invalidate the built crate whenever any of the included header
        // files changed.
        .parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
        // Only allow certain functions to have Rust bindings generated for
        // https://docs.rs/bindgen/0.71.1/bindgen/struct.Builder.html#method.allowlist_function
        .allowlist_function("nvtiffDecodeCheckSupported")
        .allowlist_function("nvtiffDecodeImage")
        .allowlist_function("nvtiffDecoderCreateSimple")
        .allowlist_function("nvtiffStreamCreate")
        .allowlist_function("nvtiffStreamParse")
        .allowlist_function("nvtiffStreamGetImageInfo")
        .allowlist_function("nvtiffStreamGetNumImages")
        .allowlist_function("nvtiffStreamGetTagValue")
        .allowlist_function("nvtiffStreamParseFromFile")
        .allowlist_type("nvtiffImageType")
        // https://mdaverde.com/posts/rust-bindgen-enum/
        .default_enum_style(EnumVariation::ModuleConsts)
        // https://docs.rs/bindgen/0.71.1/bindgen/struct.Builder.html#method.prepend_enum_name
        .prepend_enum_name(false)
        // https://docs.rs/bindgen/0.71.1/bindgen/struct.Builder.html#method.translate_enum_integer_types
        .translate_enum_integer_types(true)
        // https://docs.rs/bindgen/0.71.1/bindgen/struct.Builder.html#method.derive_default
        .derive_default(true)
        // https://docs.rs/bindgen/0.71.1/bindgen/struct.Builder.html#method.derive_partialeq
        .derive_partialeq(true)
        // Finish the builder and generate the bindings.
        .generate()
        // Unwrap the Result and panic on failure.
        .expect("Unable to generate bindings");

    // Write the bindings to the $CARGO_MANIFEST_DIR/src/nvtiff.rs file.
    let out_path = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
    bindings
        .write_to_file(out_path.join("src/nvtiff.rs"))
        .expect("Couldn't write bindings!");
}
