extern crate bindgen;
extern crate gl_generator;
use std::env;
use std::fs::{self, File};
use std::path::{Path, PathBuf};
use gl_generator::{Registry, Api, Profile, Fallbacks};
fn main() {
        if let Ok(aar_out_dir) = env::var("AAR_OUT_DIR") {
        fs::copy(&Path::new("src/api/googlevr/aar/GVRService.aar"),
                 &Path::new(&aar_out_dir).join("GVRService.aar")).unwrap();
        fs::copy(&Path::new("src/api/oculusvr/aar/OVRService.aar"),
                 &Path::new(&aar_out_dir).join("OVRService.aar")).unwrap();
    }
    if !cfg!(feature = "googlevr") && !cfg!(feature = "oculusvr") && !cfg!(feature = "vrexternal") && !cfg!(feature = "magicleap") {
        return;
    }
    let out_dir = env::var("OUT_DIR").unwrap();
        let mut file = File::create(&Path::new(&out_dir).join("gles_bindings.rs")).unwrap();
    let gles_reg = Registry::new(Api::Gles2, (3, 0), Profile::Core, Fallbacks::All, [
        "GL_OVR_multiview2", "GL_OVR_multiview", "GL_OVR_multiview_multisampled_render_to_texture"]);
    gles_reg.write_bindings(gl_generator::StaticGenerator, &mut file)
            .unwrap();
        if cfg!(any(feature = "magicleap", feature = "oculusvr")) {
        let mut file = File::create(&Path::new(&out_dir).join("egl_bindings.rs")).unwrap();
        Registry::new(Api::Egl, (1, 5), Profile::Core, Fallbacks::All, ["EGL_KHR_fence_sync"])
            .write_bindings(gl_generator::StaticGenerator, &mut file).unwrap();
        println!("cargo:rustc-link-lib=EGL");
    }
        if cfg!(feature = "magicleap") {
        let mut builder = bindgen::Builder::default()
            .header("src/api/magicleap/magicleap_c_api.h")
            .blacklist_type("MLResult")
            .derive_default(true)
            .rustfmt_bindings(true);
        if let Ok(mlsdk) = env::var("MAGICLEAP_SDK") {
            builder = builder.clang_args(&[
                format!("--no-standard-includes"),
                format!("--sysroot={}", mlsdk),
                format!("-I{}/include", mlsdk),
                format!("-I{}/lumin/usr/include", mlsdk),
                format!("-I{}/tools/toolchains/lib64/clang/3.8/include", mlsdk),
            ]);
        }
        if let Ok(flags) = env::var("CFLAGS") {
            for flag in flags.split_whitespace() {
                builder = builder.clang_arg(flag);
            }
        }
        if let Ok(flags) = env::var("CLANGFLAGS") {
            for flag in flags.split_whitespace() {
                builder = builder.clang_arg(flag);
            }
        }
        let bindings = builder.generate().expect("Unable to generate bindings");
        let out_path = PathBuf::from(&out_dir);
        bindings.write_to_file(out_path.join("magicleap_c_api.rs"))
            .expect("Couldn't write bindings!");
    }
    let target = env::var("TARGET").unwrap();
    if target.contains("android") && cfg!(feature = "vrexternal") {
        let mut builder = bindgen::Builder::default()
            .header("src/api/vrexternal/cpp/moz_external_vr.h")
            .clang_args(&["-x", "c++", "-std=gnu++11"])
            .whitelist_type("mozilla::gfx::VRExternalShmem")
            .disable_name_namespacing()
            .derive_default(true)
            .rustfmt_bindings(true);
        if let Ok(flags) = env::var("CXXFLAGS") {
            for flag in flags.split_whitespace() {
                builder = builder.clang_arg(flag);
            }
        }
        if let Ok(flags) = env::var("CLANGFLAGS") {
            for flag in flags.split_whitespace() {
                builder = builder.clang_arg(flag);
            }
        }
        let bindings = builder.generate().expect("Unable to generate bindings");
        let out_path = PathBuf::from(&out_dir);
        bindings.write_to_file(out_path.join("moz_external_vr.rs"))
            .expect("Couldn't write bindings!");
    }
}