#!/bin/bash
set -ex
export http_proxy=127.0.0.1:9
export https_proxy=127.0.0.1:9

DEB_HOST_MULTIARCH=$(dpkg-architecture -qDEB_HOST_MULTIARCH)

WORK_DIR=$(mktemp -d)
trap 'rm -rf "$WORK_DIR"' EXIT
cd "$WORK_DIR"

# Create Bzlmod mock overrides
for mod in apple_support protobuf buildozer; do
    mkdir -p "mock_$mod"
    echo "module(name = \"$mod\")" > "mock_$mod/MODULE.bazel"
    touch "mock_$mod/BUILD"
done

# Mock zlib with system linking
mkdir -p mock_zlib
echo 'module(name = "zlib")' > mock_zlib/MODULE.bazel
cat <<EOF > mock_zlib/BUILD
cc_library(
    name = "zlib",
    linkopts = ["-lz"],
    visibility = ["//visibility:public"],
)
EOF

# Mock local JDK repo to satisfy toolchain analysis of rules_java
mkdir -p mock_local_jdk
touch mock_local_jdk/WORKSPACE
cat <<EOF > mock_local_jdk/BUILD
java_runtime(
    name = "jdk",
    srcs = [],
    java_home = "/usr/lib/jvm/default-java",
    visibility = ["//visibility:public"],
)
EOF

override_jdk_args=()
for ver in 8 11 17 21; do
    for plat in linux linux_aarch64 linux_ppc64le linux_s390x linux_riscv64 linux_loongarch64 linux_mips64el; do
        for prefix in remotejdk remote_jdk; do
            override_jdk_args+=("--override_repository=rules_java~~toolchains~${prefix}${ver}_${plat}=$WORK_DIR/mock_local_jdk")
        done
    done
done

# Create a minimal Starlark rule
cat > check.bzl <<'EOF'
"""A minimal rule for testing Stardoc."""

def _check_rule_impl(ctx):
    return []

check_rule = rule(
    implementation = _check_rule_impl,
    doc = "This is a dummy check rule to verify stardoc doc generation.",
    attrs = {
        "message": attr.string(doc = "A greeting message.", mandatory = True),
    },
)
EOF

# Create BUILD file using stardoc
cat > BUILD <<'EOF'
load("@io_bazel_skydoc//stardoc:stardoc.bzl", "stardoc")

stardoc(
    name = "check_doc",
    input = "check.bzl",
    out = "check_doc.md",
)
EOF

# Create WORKSPACE file
cat > WORKSPACE <<'EOF'
workspace(name = "test_stardoc")

local_repository(
    name = "io_bazel_skydoc",
    path = "/usr/share/bazel/tools/stardoc",
)
EOF

# Create MODULE.bazel file for Bzlmod
cat > MODULE.bazel <<'EOF'
module(name = "test_stardoc", version = "0.1")

bazel_dep(name = "stardoc", version = "0.8.1", repo_name = "io_bazel_skydoc")
bazel_dep(name = "bazel_skylib")
bazel_dep(name = "rules_cc")
EOF

# Run Bazel to generate documentation
bazel build \
    --override_module=stardoc=/usr/share/bazel/tools/stardoc \
    --override_module=apple_support=$WORK_DIR/mock_apple_support \
    --override_module=protobuf=$WORK_DIR/mock_protobuf \
    --override_module=buildozer=$WORK_DIR/mock_buildozer \
    --override_module=zlib=$WORK_DIR/mock_zlib \
    --override_repository=rules_java~~toolchains~remote_java_tools=/usr/lib/${DEB_HOST_MULTIARCH}/bazel/java_tools \
    --override_repository=rules_java~~toolchains~remote_java_tools_linux=/usr/lib/${DEB_HOST_MULTIARCH}/bazel/java_tools \
    "${override_jdk_args[@]}" \
    --java_runtime_version=local_jdk \
    --tool_java_runtime_version=local_jdk \
    --javabase=@bazel_tools//tools/jdk:local_jdk \
    --host_javabase=@bazel_tools//tools/jdk:local_jdk \
    //:check_doc

# Verify generated markdown file
test -f bazel-bin/check_doc.md
cat bazel-bin/check_doc.md
grep -q "This is a dummy check rule to verify stardoc doc generation." bazel-bin/check_doc.md
grep -q "greeting message" bazel-bin/check_doc.md

echo "Stardoc functional test passed successfully!"
