use std::env;
        use std::process::Command;

        fn main() {
            println!("cargo:rerun-if-changed=build.rs");
            println!("cargo:rerun-if-env-changed=DOCS_RS");
            println!("cargo:rerun-if-env-changed=DEVELOPER_DIR");

            if env::var("DOCS_RS").is_ok() {
                return;
            }

            println!("cargo:rustc-link-lib=framework=MapKit");
            println!("cargo:rustc-link-lib=framework=Foundation");
            println!("cargo:rustc-link-lib=framework=CoreLocation");
            println!("cargo:rustc-link-lib=framework=CoreGraphics");
            println!("cargo:rustc-link-lib=framework=AppKit");

            let swift_dir = "swift-bridge";
            let out_dir = env::var("OUT_DIR").unwrap();
            let swift_build_dir = format!("{out_dir}/swift-build");

            println!("cargo:rerun-if-changed={swift_dir}");

            let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default();
            let swift_triple = match target_arch.as_str() {
                "x86_64" => "x86_64-apple-macosx",
                "aarch64" => "arm64-apple-macosx",
                other => panic!("mapkit: unsupported target arch '{other}'"),
            };

            let swift_args = vec![
                "build",
                "-c",
                "release",
                "--triple",
                swift_triple,
                "--package-path",
                swift_dir,
                "--scratch-path",
                &swift_build_dir,
            ];

            let output = Command::new("swift")
                .args(&swift_args)
                .output()
                .expect("Failed to build Swift bridge");

            if !output.status.success() {
                eprintln!(
                    "Swift build STDOUT:
{}",
                    String::from_utf8_lossy(&output.stdout)
                );
                eprintln!(
                    "Swift build STDERR:
{}",
                    String::from_utf8_lossy(&output.stderr)
                );
                panic!(
                    "Swift build failed with exit code: {:?}",
                    output.status.code()
                );
            }

            println!("cargo:rustc-link-search=native={swift_build_dir}/release");
            println!("cargo:rustc-link-lib=static=MapKitBridge");
            println!("cargo:rustc-link-arg=-Wl,-rpath,/usr/lib/swift");

            if let Ok(output) = Command::new("xcode-select").arg("-p").output() {
                if output.status.success() {
                    let xcode_path = String::from_utf8_lossy(&output.stdout).trim().to_string();
                    let swift_lib_path =
                        format!("{xcode_path}/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx");
                    println!("cargo:rustc-link-arg=-Wl,-rpath,{swift_lib_path}");
                }
            }
        }
