use std::env;
use std::fmt;

#[derive(Clone, Copy, PartialEq, Eq)]
enum PolyfillLevel {
    // Native, ie no polyfill. Just reexport from core::sync::atomic
    Native,
    // Full polyfill: polyfill both load/store and CAS with critical sections
    Polyfill,
}

impl fmt::Display for PolyfillLevel {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let s = match *self {
            Self::Native => "native",
            Self::Polyfill => "polyfill",
        };
        write!(f, "{}", s)
    }
}

fn main() {
    let target = env::var("TARGET").unwrap();

    use PolyfillLevel::*;

    let patterns = [
        ("riscv32imac-*", (Native, Polyfill)),
        ("riscv32gc-*", (Native, Polyfill)),
        ("riscv32imc-*-espidf", (Native, Native)),
        ("riscv32*", (Polyfill, Polyfill)),
        ("avr-*", (Polyfill, Polyfill)),
        ("thumbv4t-*", (Polyfill, Polyfill)),
        ("thumbv6m-*", (Polyfill, Polyfill)),
        ("thumbv7m-*", (Native, Polyfill)),
        ("thumbv7em-*", (Native, Polyfill)),
        ("thumbv8m.base-*", (Native, Polyfill)),
        ("thumbv8m.main-*", (Native, Polyfill)),
        ("xtensa-*-espidf", (Native, Native)),
        ("xtensa-esp32-*", (Native, Polyfill)),
        ("xtensa-esp32s2-*", (Polyfill, Polyfill)),
        ("xtensa-esp32s3-*", (Native, Polyfill)),
        ("xtensa-esp8266-*", (Polyfill, Polyfill)),
    ];

    if let Some((_, (level, level64))) = patterns
        .iter()
        .find(|(pattern, _)| matches(pattern, &target))
    {
        if *level == PolyfillLevel::Polyfill {
            println!("cargo:rustc-cfg=polyfill_u8");
            println!("cargo:rustc-cfg=polyfill_u16");
            println!("cargo:rustc-cfg=polyfill_u32");
            println!("cargo:rustc-cfg=polyfill_usize");
            println!("cargo:rustc-cfg=polyfill_i8");
            println!("cargo:rustc-cfg=polyfill_i16");
            println!("cargo:rustc-cfg=polyfill_i32");
            println!("cargo:rustc-cfg=polyfill_isize");
            println!("cargo:rustc-cfg=polyfill_ptr");
            println!("cargo:rustc-cfg=polyfill_bool");
        }

        if *level64 == PolyfillLevel::Polyfill {
            println!("cargo:rustc-cfg=polyfill_u64");
            println!("cargo:rustc-cfg=polyfill_i64");
        }
    } else {
        // If we don't know about the target, just reexport the entire `core::atomic::*`
        // This doesn't polyfill anything, but it's guaranteed to never fail build.
        println!("cargo:rustc-cfg=reexport_core");
    }

    if target.starts_with("avr-") {
        println!("cargo:rustc-cfg=missing_refunwindsafe")
    }
}

// tiny glob replacement to avoid pulling in more crates.
// Supports 0 or 1 wildcards `*`
fn matches(pattern: &str, val: &str) -> bool {
    if let Some(p) = pattern.find('*') {
        let prefix = &pattern[..p];
        let suffix = &pattern[p + 1..];
        val.len() >= prefix.len() + suffix.len() && val.starts_with(prefix) && val.ends_with(suffix)
    } else {
        val == pattern
    }
}
