# 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("@dev_pip//:requirements.bzl", "requirement")
load("//python:pip.bzl", "compile_pip_requirements")
load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED")  # buildifier: disable=bzl-visibility
load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER")  # buildifier: disable=bzl-visibility
load("//sphinxdocs:readthedocs.bzl", "readthedocs_install")
load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs", "sphinx_inventory")
load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardocs")

# 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 IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"]

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

sphinx_inventory(
    name = "bazel_inventory",
    src = "bazel_inventory.txt",
    visibility = ["//:__subpackages__"],
)

sphinx_stardocs(
    name = "bzl_api_docs",
    docs = {
        "api/python/cc/py_cc_toolchain.md": dict(
            dep = "//python/private:py_cc_toolchain_bzl",
            input = "//python/private:py_cc_toolchain_rule.bzl",
            public_load_path = "//python/cc:py_cc_toolchain.bzl",
        ),
        "api/python/cc/py_cc_toolchain_info.md": "//python/cc:py_cc_toolchain_info_bzl",
        "api/python/defs.md": "//python:defs_bzl",
        "api/python/entry_points/py_console_script_binary.md": "//python/entry_points:py_console_script_binary_bzl",
        "api/python/packaging.md": "//python:packaging_bzl",
        "api/python/pip.md": "//python:pip_bzl",
        "api/python/private/common/py_binary_rule_bazel.md": "//python/private/common:py_binary_rule_bazel_bzl",
        "api/python/private/common/py_library_rule_bazel.md": "//python/private/common:py_library_rule_bazel_bzl",
        "api/python/private/common/py_runtime_rule.md": "//python/private/common:py_runtime_rule_bzl",
        "api/python/private/common/py_test_rule_bazel.md": "//python/private/common:py_test_rule_bazel_bzl",
        "api/python/py_binary.md": "//python:py_binary_bzl",
        "api/python/py_cc_link_params_info.md": "//python:py_cc_link_params_info_bzl",
        "api/python/py_library.md": "//python:py_library_bzl",
        "api/python/py_runtime.md": "//python:py_runtime_bzl",
        "api/python/py_runtime_info.md": "//python:py_runtime_info_bzl",
        "api/python/py_runtime_pair.md": dict(
            dep = "//python/private:py_runtime_pair_rule_bzl",
            input = "//python/private:py_runtime_pair_rule.bzl",
            public_load_path = "//python:py_runtime_pair.bzl",
        ),
        "api/python/py_test.md": "//python:py_test_bzl",
    } | ({
        # Bazel 6 + Stardoc isn't able to parse something about the python bzlmod extension
        "api/python/extensions/python.md": "//python/extensions:python_bzl",
    } if IS_BAZEL_7_OR_HIGHER else {}) | ({
        # This depends on @pythons_hub, which is only created under bzlmod,
        "api/python/extensions/pip.md": "//python/extensions:pip_bzl",
    } if IS_BAZEL_7_OR_HIGHER and BZLMOD_ENABLED else {}),
    tags = ["docs"],
    target_compatible_with = _TARGET_COMPATIBLE_WITH,
)

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

sphinx_build_binary(
    name = "sphinx-build",
    target_compatible_with = _TARGET_COMPATIBLE_WITH,
    deps = [
        requirement("sphinx"),
        requirement("sphinx_rtd_theme"),
        requirement("myst_parser"),
        requirement("readthedocs_sphinx_ext"),
        requirement("typing_extensions"),
        "//sphinxdocs/src/sphinx_bzl",
    ],
)

# Run bazel run //docs/sphinx:requirements.update
compile_pip_requirements(
    name = "requirements",
    src = "pyproject.toml",
    requirements_txt = "requirements.txt",
    target_compatible_with = _TARGET_COMPATIBLE_WITH,
)
