# Copyright (C) 2017 The Dagger Authors.
#
# 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("@rules_java//java:defs.bzl", "java_library")
load("@google_bazel_common//tools/javadoc:javadoc.bzl", "javadoc_library")
load("@google_bazel_common//tools/jarjar:jarjar.bzl", "jarjar_library")
load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "define_kt_toolchain")

package(default_visibility = ["//visibility:public"])

define_kt_toolchain(
    name = "kotlin_toolchain",
    api_version = "1.4",
    jvm_target = "1.8",
    language_version = "1.4",
)

package_group(
    name = "src",
    packages = ["//..."],
)

java_library(
    name = "dagger_with_compiler",
    exported_plugins = ["//java/dagger/internal/codegen:component-codegen"],
    exports = ["//java/dagger:core"],
)

java_library(
    name = "producers_with_compiler",
    exports = [
        ":dagger_with_compiler",
        "//java/dagger/producers",
    ],
)

java_library(
    name = "spi",
    exports = ["//java/dagger/spi"],
)

java_library(
    name = "compiler_internals",
    exports = [
        "//java/dagger/internal/codegen:processor",
        "//java/dagger/internal/codegen/base",
        "//java/dagger/internal/codegen/binding",
        "//java/dagger/internal/codegen/validation",
        "//java/dagger/internal/codegen/writing",
    ],
)

android_library(
    name = "android",
    exported_plugins = ["//java/dagger/android/processor:plugin"],
    exports = ["//java/dagger/android"],
)

android_library(
    name = "android-support",
    exports = [
        ":android",
        "//java/dagger/android/support",
    ],
)

jarjar_library(
    name = "shaded_android_processor",
    jars = [
        "//java/dagger/android/processor",
        "@maven//:com_google_auto_auto_common",
    ],
    rules = [
        "rule com.google.auto.common.** dagger.android.shaded.auto.common.@1",
    ],
)

jarjar_library(
    name = "shaded_grpc_server_processor",
    jars = [
        "//java/dagger/grpc/server/processor",
        "@maven//:com_google_auto_auto_common",
    ],
    rules = [
        "rule com.google.auto.common.** dagger.grpc.shaded.auto.common.@1",
    ],
)

android_library(
    name = "android_local_test_exports",
    exports = [
        # TODO(bcorso): see if we can remove jsr250 dep from autovalue to prevent this.
        "@javax_annotation_jsr250_api",  # For @Generated
        "@maven//:org_robolectric_shadows_framework",  # For ActivityController
        "@maven//:androidx_lifecycle_lifecycle_common",  # For Lifecycle.State
        "@maven//:androidx_activity_activity",  # For ComponentActivity
        "@maven//:androidx_test_core",  # For ApplicationProvider
        "@maven//:androidx_test_ext_junit",
        "@maven//:org_robolectric_annotations",
        "@maven//:org_robolectric_robolectric",
        "@robolectric//bazel:android-all",
    ],
)

# coalesced javadocs used for the gh-pages site
javadoc_library(
    name = "user-docs",
    testonly = 1,
    srcs = [
        "//java/dagger:javadoc-srcs",
        "//java/dagger/android:android-srcs",
        "//java/dagger/android/support:support-srcs",
        "//java/dagger/grpc/server:javadoc-srcs",
        "//java/dagger/grpc/server/processor:javadoc-srcs",
        "//java/dagger/hilt:javadoc-srcs",
        "//java/dagger/producers:producers-srcs",
        "//java/dagger/spi:spi-srcs",
    ],
    android_api_level = 30,
    # TODO(ronshapiro): figure out how to specify the version number for release builds
    doctitle = "Dagger Dependency Injection API",
    exclude_packages = [
        "dagger.hilt.android.internal",
        "dagger.hilt.internal",
        "dagger.internal",
        "dagger.producers.internal",
        "dagger.producers.monitoring.internal",
    ],
    root_packages = ["dagger"],
    deps = [
        "//java/dagger:core",
        "//java/dagger/android",
        "//java/dagger/android/support",
        "//java/dagger/grpc/server",
        "//java/dagger/grpc/server/processor",
        "//java/dagger/hilt/android:artifact-lib",
        "//java/dagger/hilt/android/testing:artifact-lib",
        "//java/dagger/producers",
        "//java/dagger/spi",
    ],
)
