use std::{env, path::PathBuf};

fn config() -> prost_build::Config {
    let mut config = prost_build::Config::new();
    config.bytes(&["."]);
    config
}

fn make_protos(protos: &[&str]) {
    let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
    tonic_build::configure()
        .file_descriptor_set_path(out_dir.join("descriptor.bin"))
        .compile_with_config(config(), protos, &["."])
        .unwrap();
}

fn main() {
    std::env::set_var("PROTOC", protobuf_src::protoc());

    let mut protos = vec!["types/types.proto"];

    if cfg!(feature = "sentry") {
        protos.push("p2psentry/sentry.proto");
    }

    if cfg!(feature = "sentinel") {
        protos.push("p2psentinel/sentinel.proto");
    }

    if cfg!(feature = "remotekv") {
        protos.push("remote/ethbackend.proto");
        protos.push("remote/kv.proto");
    }

    if cfg!(feature = "snapshotsync") {
        protos.push("downloader/downloader.proto");
    }

    if cfg!(feature = "txpool") {
        protos.push("txpool/mining.proto");
        protos.push("txpool/txpool.proto");
    }

    if cfg!(feature = "execution") {
        protos.push("execution/execution.proto");
    }

    if cfg!(feature = "web3") {
        protos.push("web3/common.proto");
        protos.push("web3/debug.proto");
        protos.push("web3/eth.proto");
        protos.push("web3/trace.proto");
    }

    make_protos(&protos);
}
