/*
 * Copyright ConsenSys AG.
 *
 * 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.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

apply plugin: 'java-library'

jar {
  archiveBaseName = 'besu-api'
  manifest {
    attributes(
      'Specification-Title': archiveBaseName,
      'Specification-Version': project.version,
      'Implementation-Title': archiveBaseName,
      'Implementation-Version': calculateVersion()
      )
  }
}

configurations {
  testResourceGeneration.extendsFrom testImplementation
}

dependencies {
  implementation project(':config')
  implementation project(':crypto')
  implementation project(':enclave')
  implementation project(':ethereum:blockcreation')
  implementation project(':ethereum:core')
  implementation project(':ethereum:eth')
  implementation project(':ethereum:p2p')
  implementation project(':ethereum:permissioning')
  implementation project(':ethereum:rlp')
  implementation project(':metrics:core')
  implementation project(':nat')
  implementation project(':plugin-api')
  implementation project(':util')

  implementation 'com.google.guava:guava'
  implementation 'com.graphql-java:graphql-java'
  implementation 'io.vertx:vertx-auth-jwt'
  implementation 'io.vertx:vertx-core'
  implementation 'io.vertx:vertx-unit'
  implementation 'io.vertx:vertx-web'
  implementation 'org.apache.logging.log4j:log4j-core'
  implementation 'org.apache.tuweni:tuweni-bytes'
  implementation 'org.apache.tuweni:tuweni-net'
  implementation 'org.apache.tuweni:tuweni-toml'
  implementation 'org.apache.tuweni:tuweni-units'
  implementation 'org.bouncycastle:bcprov-jdk15on'
  implementation 'org.springframework.security:spring-security-crypto'

  runtimeOnly 'org.bouncycastle:bcpkix-jdk15on'

  testImplementation project(':config')
  testImplementation project(path: ':config', configuration: 'testSupportArtifacts')
  testImplementation project(path: ':ethereum:core', configuration: 'testArtifacts')
  testImplementation project(path: ':ethereum:core', configuration: 'testSupportArtifacts')
  testImplementation project(':services:kvstore')
  testImplementation project(':testutil')

  testResourceGeneration project(':besu')

  testImplementation 'com.squareup.okhttp3:okhttp'
  testImplementation 'io.vertx:vertx-codegen'
  testImplementation 'io.vertx:vertx-unit'
  testImplementation 'junit:junit'
  testImplementation 'org.assertj:assertj-core'
  testImplementation 'org.mockito:mockito-core'

  testSupportImplementation 'org.bouncycastle:bcpkix-jdk15on'

  integrationTestImplementation project(':config')
  integrationTestImplementation project(path: ':config', configuration: 'testSupportArtifacts')
  integrationTestImplementation project(path: ':ethereum:core', configuration: 'testSupportArtifacts')
  integrationTestImplementation project(':services:kvstore')
  integrationTestImplementation project(':testutil')

  integrationTestImplementation 'junit:junit'
  integrationTestImplementation 'org.assertj:assertj-core'
  integrationTestImplementation 'org.mockito:mockito-core'
}

artifacts {
  testSupportArtifacts testSupportJar
}

task generateTestBlockchain() {
  def srcFiles = 'src/test/resources/org/hyperledger/besu/ethereum/api/jsonrpc/trace/chain-data'
  def dataPath = "$buildDir/generated/data"
  def blocksBin = "$buildDir/resources/test/org/hyperledger/besu/ethereum/api/jsonrpc/trace/chain-data/blocks.bin"
  inputs.dir(srcFiles)
  outputs.file(blocksBin)
  dependsOn(configurations.testResourceGeneration)
  dependsOn(processTestResources)
  doLast {
    mkdir(dataPath)
    javaexec {
      main = 'org.hyperledger.besu.Besu'
      classpath = configurations.testResourceGeneration
      args = [
        "--logging=ERROR",
        "--data-path=$dataPath",
        "--genesis-file=$srcFiles/genesis.json",
        "blocks",
        "import",
        "--format=JSON",
        "--from=$srcFiles/blocks.json"
      ]
    }
    javaexec {
      main = 'org.hyperledger.besu.Besu'
      classpath = configurations.testResourceGeneration
      args = [
        "--logging=ERROR",
        "--data-path=$dataPath",
        "--genesis-file=$srcFiles/genesis.json",
        "blocks",
        "export",
        "--format=RLP",
        "--start-block=0",
        "--to=$blocksBin"
      ]
    }
  }
}
test.dependsOn(generateTestBlockchain)
