#!/bin/bash
set -eux

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

WORKDIR="${AUTOPKGTEST_TMP}"

cp -a examples/bzlmod/hello_world_no_cargo/. "$WORKDIR/"
cp -a debian/mock_repos "$WORKDIR/"
cd "$WORKDIR"

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

# Override rules_rust to point to the system-installed package
sed -i 's|path = "../../.."|path = "/usr/share/bazel/rules/rust"|' MODULE.bazel

# 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"

export CARGO_BAZEL_GENERATOR_URL="file://$WORKDIR/mock_repos/cargo_bazel/cargo-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=rules_rust=/usr/share/bazel/rules/rust
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=rules_rust~~rust~rust_toolchains=$WORKDIR/mock_repos/rust_tools
common --override_repository=rust_toolchains=$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=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=rules_rust~~i~rules_rust_tinyjson=$WORKDIR/mock_repos/tinyjson
common --override_repository=rules_rust_tinyjson=$WORKDIR/mock_repos/tinyjson

common --repo_env=CARGO_BAZEL_GENERATOR_URL=file://$WORKDIR/mock_repos/cargo_bazel/cargo-bazel
EOF_RC

# Build the hello_world binary with bazel
bazel build --color=no --curses=no --subcommands --verbose_failures //:hello_world
./bazel-bin/hello_world
