use std::path::Path;

const KEYS: [&str; 3] = ["GRID_USER", "GRID_PASSWORD", "GRID_LOGIN_URL"];
const LIVE_OPT_IN: &str = "RUN_LIVE_TESTS";

fn dotenv_has(path: &Path, key: &str) -> bool {
    std::fs::read_to_string(path).is_ok_and(|contents| {
        contents.lines().any(|line| {
            let line = line.trim().strip_prefix("export ").unwrap_or(line.trim());
            line.split_once('=').is_some_and(|(name, value)| {
                name.trim() == key && !value.trim().trim_matches(['\'', '"']).is_empty()
            })
        })
    })
}

fn main() {
    let dotenv = Path::new(&std::env::var("CARGO_MANIFEST_DIR").expect("manifest directory"))
        .join("../..")
        .join(".env");
    println!("cargo:rustc-check-cfg=cfg(live_grid_credentials)");
    println!("cargo:rerun-if-changed={}", dotenv.display());
    for key in KEYS {
        println!("cargo:rerun-if-env-changed={key}");
    }
    println!("cargo:rerun-if-env-changed={LIVE_OPT_IN}");
    let opted_in = std::env::var(LIVE_OPT_IN).is_ok_and(|value| {
        matches!(
            value.trim().to_ascii_lowercase().as_str(),
            "1" | "true" | "yes"
        )
    });
    if opted_in
        && KEYS.iter().all(|key| {
            std::env::var(key).is_ok_and(|value| !value.trim().is_empty())
                || dotenv_has(&dotenv, key)
        })
    {
        println!("cargo:rustc-cfg=live_grid_credentials");
    }
}
