#!/bin/bash
set -eux

export http_proxy=127.0.0.1:9
export https_proxy=127.0.0.1:9

WORKDIR="${AUTOPKGTEST_TMP}/unit"
mkdir -p "$WORKDIR"

cp -a /usr/share/bazel/rules/rust/. "$WORKDIR/"
cp -a debian/mock_repos "$WORKDIR/"
cd "$WORKDIR"

touch "$WORKDIR/WORKSPACE"
touch "$WORKDIR/WORKSPACE.bzlmod"

# Simplify MODULE.bazel when running as root module to avoid fetching unpackaged dev_dependencies
cat << 'EOF_MOD' > "$WORKDIR/MODULE.bazel"
module(
    name = "rules_rust",
    version = "0.54.1",
)

bazel_dep(name = "bazel_features", version = "1.9.1")
bazel_dep(name = "bazel_skylib", version = "1.5.0")
bazel_dep(name = "platforms", version = "0.0.8")
bazel_dep(name = "rules_cc", version = "0.0.9")
bazel_dep(name = "rules_license", version = "0.0.8")
bazel_dep(name = "rules_proto", version = "6.0.2")
bazel_dep(name = "apple_support", version = "1.13.0", repo_name = "build_bazel_apple_support")
bazel_dep(name = "protobuf", version = "21.7", repo_name = "com_google_protobuf")
bazel_dep(name = "aspect_rules_js", version = "1.39.0")

internal_deps = use_extension("//rust/private:extensions.bzl", "i")
use_repo(
    internal_deps,
    "rules_rust_tinyjson",
    "rules_rust_toolchain_test_target_json",
)

rust = use_extension("//rust:extensions.bzl", "rust")
rust.toolchain(edition = "2021")
use_repo(rust, "rust_toolchains")

register_toolchains("@rust_toolchains//:all")
EOF_MOD

# Detect host Rust triple
RUST_TRIPLE=$(rustc -vV | sed -n 's/^host: //p')

# Setup tinyjson from system librust-tinyjson-dev package
mkdir -p "$WORKDIR/mock_repos/tinyjson/src"
cp -a /usr/share/cargo/registry/tinyjson-*/src/* "$WORKDIR/mock_repos/tinyjson/src/"

# Setup rust_tools
mkdir -p "$WORKDIR/mock_repos/rust_tools/bin"
ln -sf /usr/bin/rustc "$WORKDIR/mock_repos/rust_tools/bin/rustc"
ln -sf /usr/bin/rustdoc "$WORKDIR/mock_repos/rust_tools/bin/rustdoc"
if [ -x /usr/bin/cargo ]; then
    ln -sf /usr/bin/cargo "$WORKDIR/mock_repos/rust_tools/bin/cargo"
else
    ln -sf "$WORKDIR/mock_repos/rust_tools/bin/rustfmt" "$WORKDIR/mock_repos/rust_tools/bin/cargo"
fi

mkdir -p "$WORKDIR/mock_repos/rust_tools/lib/rustlib/${RUST_TRIPLE}/lib"
if [ -d "/usr/lib/rustlib/${RUST_TRIPLE}/lib" ]; then
    cp -a /usr/lib/rustlib/${RUST_TRIPLE}/lib/* "$WORKDIR/mock_repos/rust_tools/lib/rustlib/${RUST_TRIPLE}/lib/" || true
fi

sed -i "s|@TRIPLE@|${RUST_TRIPLE}|g" "$WORKDIR/mock_repos/rust_tools/BUILD.bazel"

# Add system module and repository overrides into .bazelrc
cat << EOF_RC > "$WORKDIR/.bazelrc"
common --color=no
common --curses=no
common --show_timestamps
common --noenable_workspace
build --subcommands
build --verbose_failures
build --@rules_rust//rust/settings:toolchain_generated_sysroot=false

common --override_module=bazel_features=/usr/share/bazel/tools/features
common --override_module=bazel_skylib=/usr/share/bazel/tools/skylib
common --override_module=platforms=/usr/share/bazel/tools/platforms
common --override_module=rules_cc=/usr/share/bazel/rules/cc
common --override_repository=rules_cc=/usr/share/bazel/rules/cc
common --override_module=rules_proto=/usr/share/bazel/rules/proto
common --override_repository=rules_proto=/usr/share/bazel/rules/proto
common --override_module=rules_license=/usr/share/bazel/rules/license
common --override_repository=rules_license=/usr/share/bazel/rules/license

common --override_module=apple_support=$WORKDIR/mock_repos/apple_support
common --override_module=aspect_rules_js=$WORKDIR/mock_repos/aspect_rules_js
common --override_module=protobuf=$WORKDIR/mock_repos/protobuf
common --override_module=buildozer=$WORKDIR/mock_repos/buildozer
common --override_module=zlib=$WORKDIR/mock_repos/zlib

common --override_repository=_main~rust~rust_toolchains=$WORKDIR/mock_repos/rust_tools
common --override_repository=rules_rust~~rust~rust_toolchains=$WORKDIR/mock_repos/rust_tools
common --override_repository=rust_toolchains=$WORKDIR/mock_repos/rust_tools
common --override_repository=_main~rust_host_tools~rust_host_tools=$WORKDIR/mock_repos/rust_tools
common --override_repository=rules_rust~~rust_host_tools~rust_host_tools=$WORKDIR/mock_repos/rust_tools
common --override_repository=rust_host_tools=$WORKDIR/mock_repos/rust_tools

common --override_repository=_main~crate~cargo_bazel_bootstrap=$WORKDIR/mock_repos/cargo_bazel
common --override_repository=_main~cargo_bazel_bootstrap~cargo_bazel_bootstrap=$WORKDIR/mock_repos/cargo_bazel
common --override_repository=rules_rust~~crate~cargo_bazel_bootstrap=$WORKDIR/mock_repos/cargo_bazel
common --override_repository=rules_rust~~cargo_bazel_bootstrap~cargo_bazel_bootstrap=$WORKDIR/mock_repos/cargo_bazel

common --override_repository=_main~i~rules_rust_tinyjson=$WORKDIR/mock_repos/tinyjson
common --override_repository=rules_rust~~i~rules_rust_tinyjson=$WORKDIR/mock_repos/tinyjson
common --override_repository=rules_rust_tinyjson=$WORKDIR/mock_repos/tinyjson
EOF_RC

# Run Starlark analysis unit tests in //test/unit/...
# Exclude 3 test packages written specifically for legacy WORKSPACE mode (which assume workspace name "rules_rust" or non-canonical labels rather than Bzlmod "_main")
bazel test --color=no --curses=no --subcommands --verbose_failures --test_output=errors -- \
    //test/unit/... \
    -//test/unit/linkstamps/... \
    -//test/unit/native_deps/... \
    -//test/unit/per_crate_rustc_flag/...
