/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

def grpcVersion = '1.15.0'

dependencies {
    implementation 'io.cloudevents:cloudevents-core'

    implementation 'io.opentelemetry:opentelemetry-api'
    implementation 'io.opentelemetry:opentelemetry-sdk'
    implementation 'io.opentelemetry:opentelemetry-exporter-zipkin'
    implementation 'io.opentelemetry:opentelemetry-semconv'

    implementation "org.apache.httpcomponents:httpclient"
    implementation 'io.netty:netty-all'

    implementation 'com.github.seancfoley:ipaddress:5.3.3'

    implementation project(":eventmesh-common")
    implementation project(":eventmesh-spi")
    implementation project(":eventmesh-connector-plugin:eventmesh-connector-api")
    implementation project(":eventmesh-connector-plugin:eventmesh-connector-standalone")
    implementation project(":eventmesh-security-plugin:eventmesh-security-api")
    implementation project(":eventmesh-security-plugin:eventmesh-security-acl")
    implementation project(":eventmesh-security-plugin:eventmesh-security-auth-http-basic")
    implementation project(":eventmesh-registry-plugin:eventmesh-registry-api")
    implementation project(":eventmesh-admin:eventmesh-admin-rocketmq")


    implementation project(":eventmesh-registry-plugin:eventmesh-registry-nacos")


    implementation project(":eventmesh-protocol-plugin:eventmesh-protocol-api")

    implementation "io.grpc:grpc-protobuf:${grpcVersion}"
    implementation "io.grpc:grpc-stub:${grpcVersion}"
    implementation "io.grpc:grpc-netty:${grpcVersion}"
    implementation "io.grpc:grpc-netty-shaded:${grpcVersion}"

    compileOnly 'org.projectlombok:lombok:1.18.22'
    annotationProcessor 'org.projectlombok:lombok:1.18.22'

    // for debug only, can be removed
    implementation project(":eventmesh-protocol-plugin:eventmesh-protocol-cloudevents")
    implementation project(":eventmesh-protocol-plugin:eventmesh-protocol-meshmessage")
    implementation project(":eventmesh-protocol-plugin:eventmesh-protocol-openmessage")
    implementation project(":eventmesh-protocol-plugin:eventmesh-protocol-http")

    implementation project(":eventmesh-metrics-plugin:eventmesh-metrics-api")
    implementation project(":eventmesh-metrics-plugin:eventmesh-metrics-prometheus")

    implementation project(":eventmesh-trace-plugin:eventmesh-trace-api")
    implementation project(":eventmesh-trace-plugin:eventmesh-trace-zipkin")

    testImplementation "org.mockito:mockito-core"
    testImplementation "org.powermock:powermock-module-junit4"
    testImplementation "org.powermock:powermock-api-mockito2"
}
