# Copyright (c) 2009-2021, Google LLC
# All rights reserved.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd

load("@bazel_skylib//lib:selects.bzl", "selects")
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag", "string_flag")

# begin:github_only
load("@rules_pkg//pkg:mappings.bzl", "pkg_files")
load("//python:build_targets.bzl", "build_targets")
load("//python:py_extension.bzl", "py_extension")
load("//upb/bazel:build_defs.bzl", "UPB_DEFAULT_COPTS")

build_targets(name = "python")
# end:github_only

licenses(["notice"])

package(
    # begin:google_only
    #     default_applicable_licenses = ["//upb:license"],
    # end:google_only
    default_visibility = ["//python/dist:__pkg__"],
)

LIMITED_API_FLAG_SELECT = {
    ":limited_api_3.8": ["-DPy_LIMITED_API=0x03080000"],
    ":limited_api_3.10": ["-DPy_LIMITED_API=0x030a0000"],
    "//conditions:default": [],
}

bool_flag(
    name = "limited_api",
    build_setting_default = True,
)

string_flag(
    name = "python_version",
    build_setting_default = "system",
    values = [
        "system",
        "38",
        "39",
        "310",
        "311",
    ],
)

config_setting(
    name = "limited_api_3.8",
    flag_values = {
        ":limited_api": "True",
        ":python_version": "38",
    },
)

config_setting(
    name = "full_api_3.8_win32",
    flag_values = {
        ":limited_api": "False",
        ":python_version": "38",
    },
    values = {"cpu": "win32"},
)

config_setting(
    name = "full_api_3.8_win64",
    flag_values = {
        ":limited_api": "False",
        ":python_version": "38",
    },
    values = {"cpu": "win64"},
)

selects.config_setting_group(
    name = "full_api_3.8",
    match_any = [
        ":full_api_3.8_win32",
        ":full_api_3.8_win64",
    ],
)

config_setting(
    name = "full_api_3.9_win32",
    flag_values = {
        ":limited_api": "False",
        ":python_version": "39",
    },
    values = {"cpu": "win32"},
)

config_setting(
    name = "full_api_3.9_win64",
    flag_values = {
        ":limited_api": "False",
        ":python_version": "39",
    },
    values = {"cpu": "win64"},
)

selects.config_setting_group(
    name = "full_api_3.9",
    match_any = [
        "full_api_3.9_win32",
        ":full_api_3.9_win64",
    ],
)

config_setting(
    name = "limited_api_3.10_win32",
    flag_values = {
        ":limited_api": "True",
        ":python_version": "310",
    },
    values = {"cpu": "win32"},
)

config_setting(
    name = "limited_api_3.10_win64",
    flag_values = {
        ":limited_api": "True",
        ":python_version": "310",
    },
    values = {"cpu": "win64"},
)

selects.config_setting_group(
    name = "limited_api_3.10",
    match_any = [
        ":limited_api_3.10_win32",
        ":limited_api_3.10_win64",
    ],
)

# begin:github_only
_message_target_compatible_with = {
    "@platforms//os:windows": ["@platforms//:incompatible"],
    "@system_python//:none": ["@platforms//:incompatible"],
    "@system_python//:unsupported": ["@platforms//:incompatible"],
    "//conditions:default": [],
}

# end:github_only
# begin:google_only
# _message_target_compatible_with = {
#     "@platforms//os:windows": ["@platforms//:incompatible"],
#     "//conditions:default": [],
# }
# end:google_only

filegroup(
    name = "message_srcs",
    srcs = [
        "convert.c",
        "convert.h",
        "descriptor.c",
        "descriptor.h",
        "descriptor_containers.c",
        "descriptor_containers.h",
        "descriptor_pool.c",
        "descriptor_pool.h",
        "extension_dict.c",
        "extension_dict.h",
        "map.c",
        "map.h",
        "message.c",
        "message.h",
        "protobuf.c",
        "protobuf.h",
        "python_api.h",
        "repeated.c",
        "repeated.h",
        "unknown_fields.c",
        "unknown_fields.h",
    ],
    # begin:google_only
    #     compatible_with = ["//buildenv/target:non_prod"],
    # end:google_only
)

py_extension(
    name = "_message",
    srcs = [":message_srcs"],
    copts = UPB_DEFAULT_COPTS + select(LIMITED_API_FLAG_SELECT) + [
        # The Python API requires patterns that are ISO C incompatible, like
        # casts between function pointers and object pointers.
        "-Wno-pedantic",
    ],
    target_compatible_with = select(_message_target_compatible_with),
    deps = [
        "//third_party/utf8_range",
        "//upb:base",
        "//upb:descriptor_upb_proto_reflection",
        "//upb:eps_copy_input_stream",
        "//upb:message",
        "//upb:message_compare",
        "//upb:message_copy",
        "//upb:port",
        "//upb:reflection",
        "//upb:text",
        "//upb:wire_reader",
        "//upb/hash",
        "//upb/util:def_to_proto",
        "//upb/util:required_fields",
    ],
)
