load("@protobuf//bazel:cc_proto_library.bzl", "cc_proto_library")
load("@protobuf//bazel:proto_library.bzl", "proto_library")
load("@rules_cc//cc:defs.bzl", "objc_library")
load("//:helper.bzl", "santa_unit_test")

package(
    default_visibility = ["//:santa_package_group"],
)

licenses(["notice"])

proto_library(
    name = "result_proto",
    srcs = ["result.proto"],
    deps = [
        "@northpolesec_protos//celv2:v2_proto",
    ],
)

cc_proto_library(
    name = "result_cc_proto",
    deps = [":result_proto"],
)

objc_library(
    name = "CEL",
    srcs = [
        "Activation.mm",
        "Evaluator.mm",
        "PolicyForRangeFunction.mm",
        "RelativeTimeFunction.mm",
        "TouchIDFunction.mm",
    ],
    hdrs = [
        "Activation.h",
        "CELPlanCache.h",
        "CELProtoTraits.h",
        "Evaluator.h",
        "PolicyForRangeFunction.h",
        "RelativeTimeFunction.h",
        "TouchIDFunction.h",
    ],
    deps = [
        ":result_cc_proto",
        "//Source/common:Memoizer",
        "//Source/common:SantaCache",
        "@abseil-cpp//absl/status",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/strings",
        "@abseil-cpp//absl/time",
        "@abseil-cpp//absl/types:span",
        "@cel-cpp//checker:validation_result",
        "@cel-cpp//common:ast",
        "@cel-cpp//common:ast_proto",
        "@cel-cpp//common:decl",
        "@cel-cpp//common:expr",
        "@cel-cpp//common:function_descriptor",
        "@cel-cpp//common:navigable_ast",
        "@cel-cpp//common:type",
        "@cel-cpp//common:value",
        "@cel-cpp//compiler",
        "@cel-cpp//compiler:compiler_factory",
        "@cel-cpp//compiler:standard_library",
        "@cel-cpp//eval/public:activation",
        "@cel-cpp//eval/public:activation_bind_helper",
        "@cel-cpp//eval/public:builtin_func_registrar",
        "@cel-cpp//eval/public:cel_expr_builder_factory",
        "@cel-cpp//eval/public:cel_expression",
        "@cel-cpp//eval/public:cel_function",
        "@cel-cpp//eval/public:cel_function_adapter",
        "@cel-cpp//eval/public:cel_function_registry",
        "@cel-cpp//eval/public:cel_options",
        "@cel-cpp//eval/public:cel_value",
        "@cel-cpp//eval/public:transform_utility",
        "@cel-cpp//eval/public/containers:container_backed_list_impl",
        "@cel-cpp//eval/public/containers:container_backed_map_impl",
        "@cel-cpp//eval/public/containers:field_access",
        "@cel-cpp//eval/public/structs:cel_proto_wrapper",
        "@cel-cpp//extensions:strings",
        "@cel-cpp//internal:status_macros",
        "@cel-cpp//parser",
        "@cel-cpp//runtime:function_adapter",
        "@cel-cpp//validator",
        "@northpolesec_protos//cel:v1_cc_proto",
        "@northpolesec_protos//celv2:v2_cc_proto",
        "@protobuf//:protobuf_lite",
    ],
)

santa_unit_test(
    name = "CELTest",
    srcs = ["Test.mm"],
    deps = [
        ":CEL",
        ":result_cc_proto",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/strings",
        "@abseil-cpp//absl/time",
        "@abseil-cpp//absl/types:span",
        "@northpolesec_protos//celv2:v2_cc_proto",
    ],
)

santa_unit_test(
    name = "ArenaGrowthTest",
    srcs = ["ArenaGrowthTest.mm"],
    deps = [
        ":CEL",
        "@abseil-cpp//absl/status:statusor",
        "@northpolesec_protos//celv2:v2_cc_proto",
    ],
)

santa_unit_test(
    name = "CELPlanCacheTest",
    srcs = ["CELPlanCacheTest.mm"],
    deps = [
        ":CEL",
        ":result_cc_proto",
        "//Source/common:SantaCache",
        "@abseil-cpp//absl/status:statusor",
        "@abseil-cpp//absl/strings",
        "@northpolesec_protos//celv2:v2_cc_proto",
    ],
)
