# Copyright 2023 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

load("@bazel_skylib//rules:build_test.bzl", "build_test")
load("@sphinxdocs//sphinxdocs:readthedocs.bzl", "readthedocs_install")
load("@sphinxdocs//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs")
load("@sphinxdocs//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library")
load("@sphinxdocs//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs")
load("//python:defs.bzl", "py_binary")
load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED")  # buildifier: disable=bzl-visibility
load("//python/private:common_labels.bzl", "labels")  # buildifier: disable=bzl-visibility

package(default_visibility = ["//:__subpackages__"])

licenses(["notice"])  # Apache 2.0

# We only build for Linux and Mac because:
# 1. The actual doc process only runs on Linux
# 2. Mac is a common development platform, and is close enough to Linux
#    it's feasible to make work.
# Making CI happy under Windows is too much of a headache, though, so we don't
# bother with that.
_TARGET_COMPATIBLE_WITH = select({
    "@platforms//os:linux": [],
    "@platforms//os:macos": [],
    "//conditions:default": ["@platforms//:incompatible"],
}) if BZLMOD_ENABLED else ["@platforms//:incompatible"]

py_binary(
    name = "merge_changelog",
    srcs = ["merge_changelog.py"],
    target_compatible_with = _TARGET_COMPATIBLE_WITH,
    deps = [
        "//dev/release:changelog_news",
    ],
)

genrule(
    name = "merged_changelog",
    srcs = [
        "//:CHANGELOG.md",
        "//news:news_files",
    ],
    outs = ["changelog.md"],
    cmd = "$(location :merge_changelog) --changelog $(location //:CHANGELOG.md) --news-dir news --output $@",
    target_compatible_with = _TARGET_COMPATIBLE_WITH,
    tools = [":merge_changelog"],
)

# See README.md for instructions. Short version:
# * `bazel run //docs:docs.serve` in a separate terminal
# * `ibazel build //docs:docs` to automatically rebuild docs
sphinx_docs(
    name = "docs",
    srcs = glob(
        include = [
            "*.md",
            "**/*.md",
            "_static/**",
            "_includes/**",
        ],
        exclude = [
            "README.md",
            "_*",
            "*.inv*",
        ],
    ) + ["//gazelle/docs"],
    config = "conf.py",
    formats = [
        "html",
    ],
    renamed_srcs = {
        "//:CONTRIBUTING.md": "contributing.md",
        ":merged_changelog": "changelog.md",
        "@sphinxdocs//sphinxdocs/inventories:bazel_inventory": "bazel_inventory.inv",
    },
    sphinx = ":sphinx-build",
    strip_prefix = package_name() + "/",
    tags = ["docs"],
    target_compatible_with = _TARGET_COMPATIBLE_WITH,
    deps = [
        ":bzl_api_docs",
        ":py_api_srcs",
        ":py_runtime_pair",
        "@sphinxdocs//docs:docs_lib",
    ],
)

build_test(
    name = "docs_build_test",
    targets = [":docs"],
)

sphinx_stardocs(
    name = "bzl_api_docs",
    srcs = [
        "//python:defs",
        "//python:features",
        "//python:packaging",
        "//python:pip",
        "//python:proto",
        "//python:py_binary",
        "//python:py_cc_link_params_info",
        "//python:py_exec_tools_info",
        "//python:py_exec_tools_toolchain",
        "//python:py_executable_info",
        "//python:py_info",
        "//python:py_library",
        "//python:py_runtime",
        "//python:py_runtime_info",
        "//python:py_test",
        "//python:repositories",
        "//python/api",
        "//python/api:attr_builders",
        "//python/api:executables",
        "//python/api:libraries",
        "//python/api:rule_builders",
        "//python/cc:py_cc_toolchain",
        "//python/cc:py_cc_toolchain_info",
        "//python/cc:py_extension",
        "//python/entry_points:py_console_script_binary",
        "//python/extensions:config",
        "//python/extensions:python",
        "//python/local_toolchains:repos",
        "//python/private:attr_builders",
        "//python/private:builders",
        "//python/private:builders_util",
        "//python/private:py_binary_rule",
        "//python/private:py_cc_toolchain_rule",
        "//python/private:py_info",
        "//python/private:py_library_rule",
        "//python/private:py_runtime_rule",
        "//python/private:py_test_rule",
        "//python/private:rule_builders",
        "//python/private/api:py_common_api",
        "//python/private/pypi:config_settings",
        "//python/private/pypi:env_marker_info",
        "//python/private/pypi:pip_archive",
        "//python/private/pypi:pkg_aliases",
        "//python/private/pypi:whl_archive",
        "//python/private/pypi:whl_config_setting",
        "//python/private/pypi:whl_library",
        "//python/private/zipapp:py_zipapp_rule",
        "//python/uv",
        "//python/uv:lock",
        "//python/uv:uv_toolchain",
        "//python/uv:uv_toolchain_info",
        "//python/zipapp:py_zipapp_binary",
        "//python/zipapp:py_zipapp_test",
    ] + ([
        # This depends on @pythons_hub, which is only created under bzlmod,
        "//python/extensions:pip",
    ] if BZLMOD_ENABLED else []),
    prefix = "api/rules_python/",
    tags = ["docs"],
    target_compatible_with = _TARGET_COMPATIBLE_WITH,
)

sphinx_stardoc(
    name = "py_runtime_pair",
    src = "//python/private:py_runtime_pair_rule",
    prefix = "api/rules_python/",
    tags = ["docs"],
    target_compatible_with = _TARGET_COMPATIBLE_WITH,
)

sphinx_docs_library(
    name = "py_api_srcs",
    srcs = [
        "//python/runfiles",
    ],
    strip_prefix = "python/",
)

readthedocs_install(
    name = "readthedocs_install",
    docs = [":docs"],
    target_compatible_with = _TARGET_COMPATIBLE_WITH,
)

sphinx_build_binary(
    name = "sphinx-build",
    config_settings = {
        labels.BOOTSTRAP_IMPL: "script",
        labels.VENVS_SITE_PACKAGES: "yes",
        labels.PY_FREETHREADED: "yes",
        labels.PYTHON_VERSION: "3.14",
    },
    target_compatible_with = _TARGET_COMPATIBLE_WITH,
    deps = [
        "@dev_pip//myst_parser",
        "@dev_pip//pytest",
        "@dev_pip//readthedocs_sphinx_ext",
        "@dev_pip//sphinx",
        "@dev_pip//sphinx_autodoc2",
        "@dev_pip//sphinx_reredirects",
        "@dev_pip//sphinx_rtd_theme",
        "@dev_pip//typing_extensions",
        "@sphinxdocs//sphinxdocs/src/sphinx_bzl",
    ],
)
