"""
This file contains helpers for defining build flags and options that are used to
configure the Skia build.
"""

# https://github.com/bazelbuild/bazel-skylib/blob/main/rules/common_settings.bzl
load("@bazel_skylib//rules:common_settings.bzl", "string_flag", skylib_bool_flag = "bool_flag")

# Forked from https://github.com/bazelbuild/bazel-skylib/blob/main/rules/common_settings.bzl
BuildSettingInfo = provider(
    doc = "A singleton provider that contains the raw value of a multi-string build setting",
    fields = ["values"],
)

def _multi_string_impl(ctx):
    allowed_values = ctx.attr.values
    values = ctx.build_setting_value
    for v in values:
        if v not in ctx.attr.values:
            fail("Error setting " + str(ctx.label) + ": invalid value '" + v + "'. Allowed values are " + str(allowed_values))
    return BuildSettingInfo(values = values)

multi_string_flag = rule(
    implementation = _multi_string_impl,
    build_setting = config.string(flag = True, allow_multiple = True),
    attrs = {
        "values": attr.string_list(
            doc = "The list of allowed values for this setting. An error is raised if any other values are given.",
        ),
    },
    doc = "A string-typed build setting that can be set multiple times on the command line",
)

# buildifier: disable=unnamed-macro
def string_flag_with_values(flag_name, values, default = "", multiple = False):
    """Create a string flag and corresponding config_settings.

    string_flag_with_values is a Bazel Macro that defines a flag with the given name and a set
    of valid values for that flag. For each value, a config_setting is defined with the name
    of the value, associated with the created flag.
    This is defined to make the BUILD.bazel file easier to read w/o the boilerplate of defining
    a string_flag rule and n config_settings
    https://docs.bazel.build/versions/main/skylark/macros.html

    Args:
        flag_name: string, the name of the flag to create and use for the config_settings
        values: list of strings, the valid values for this flag to be set to.
        default: string, whatever the default value should be if the flag is not set. Can be
            empty string for both a string_flag and a multi_string flag.
        multiple: boolean, True if the flag should be able to be set multiple times on the CLI.
    """
    if multiple:
        multi_string_flag(
            name = flag_name,
            # We have to specify a default value, even if that value is empty string.
            # https://docs.bazel.build/versions/main/skylark/config.html#instantiating-build-settings
            build_setting_default = default,
            # If empty string is the default, we need to make sure it is in the list
            # of acceptable values. If the default is not empty string, we don't want
            # to make empty string a valid value. Having duplicate values in the list
            # does not cause any issues, so we can just add the default to achieve
            # this affect.
            values = values + [default],
        )
    else:
        string_flag(
            name = flag_name,
            # We have to specify a default value, even if that value is empty string.
            # https://docs.bazel.build/versions/main/skylark/config.html#instantiating-build-settings
            build_setting_default = default,
            # If empty string is the default, we need to make sure it is in the list
            # of acceptable values. If the default is not empty string, we don't want
            # to make empty string a valid value. Having duplicate values in the list
            # does not cause any issues, so we can just add the default to achieve
            # this affect.
            values = values + [default],
        )

    # For each of the values given, we define a config_setting. This allows us to use
    # select statements, on the given setting, e.g. referencing
    # //bazel/common_config_settings:some_valid_value_for_a_flag
    for v in values:
        native.config_setting(
            name = v,
            flag_values = {
                ":" + flag_name: v,
            },
        )

# buildifier: disable=unnamed-macro
def bool_flag(flag_name, default = True, public = True):
    """Create a boolean flag and corresponding config_settings.

    bool_flag is a Bazel Macro that defines a boolean flag with the given name two config_settings,
    one for True, one for False. Reminder that Bazel has special syntax for unsetting boolean flags,
    but this does not work well with aliases.
    https://docs.bazel.build/versions/main/skylark/config.html#using-build-settings-on-the-command-line
    Thus it is best to define both an "enabled" alias and a "disabled" alias.

    Args:
        flag_name: string, the name of the flag to create and use for the config_settings
        default: boolean, if the flag should default to on or off.
        public: boolean, if the flag should be usable from other packages or if it is meant to be
            combined with some other constraint.
    """
    skylib_bool_flag(name = flag_name, build_setting_default = default)
    vis = ["//:__subpackages__"]
    if not public:
        vis = ["//visibility:private"]

    native.config_setting(
        name = flag_name + "_true",
        flag_values = {
            # The value must be a string, but it will be parsed to a boolean
            # https://docs.bazel.build/versions/main/skylark/config.html#build-settings-and-select
            ":" + flag_name: "True",
        },
        visibility = vis,
    )

    native.config_setting(
        name = flag_name + "_false",
        flag_values = {
            ":" + flag_name: "False",
        },
        visibility = vis,
    )
