/**
 * 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.
 */

dependencies {

    // Never use "compile" scope, but make all dependencies either 'implementation', 'runtimeOnly' or 'testCompile'.
    // Note that we never use 'api', because Fineract at least currently is a simple monolithic application ("WAR"), not a library.
    // We also (normally should have) no need to ever use 'compileOnly'.

    implementation(project(path: ':fineract-avro-schemas'))
    implementation(project(path: ':fineract-command'))
    implementation(project(path: ':fineract-validation'))


    // implementation dependencies are directly used (compiled against) in src/main (and src/test)
    implementation(
            'org.springframework.boot:spring-boot-starter-web',
            'org.springframework.boot:spring-boot-starter-security',
            'org.springframework.boot:spring-boot-starter-validation',
            'org.springframework.boot:spring-boot-starter-batch',
            'org.springframework.batch:spring-batch-integration',
            'jakarta.ws.rs:jakarta.ws.rs-api',
            'org.glassfish.jersey.media:jersey-media-multipart',
            'org.apache.avro:avro',

            'com.google.guava:guava',
            'com.google.code.gson:gson',

            'org.apache.commons:commons-lang3',

            'com.jayway.jsonpath:json-path',

            'com.github.spotbugs:spotbugs-annotations',
            'io.swagger.core.v3:swagger-annotations-jakarta',

            'com.squareup.retrofit2:converter-gson',

            'org.springdoc:springdoc-openapi-starter-webmvc-ui',
            'org.mapstruct:mapstruct',

            'io.github.resilience4j:resilience4j-spring-boot3',
            'org.apache.httpcomponents:httpcore',
            )
    implementation ('org.springframework.boot:spring-boot-starter-data-jpa') {
        exclude group: 'org.hibernate'
    }
    implementation('org.eclipse.persistence:org.eclipse.persistence.jpa') {
        exclude group: 'org.eclipse.persistence', module: 'jakarta.persistence'
    }
    implementation('org.springframework.boot:spring-boot-starter-jersey') {
        exclude group: 'org.glassfish.hk2.external', module: 'aopalliance-repackaged'
        exclude group: 'org.glassfish.hk2', module: 'hk2-runlevel'
        exclude group: 'org.hibernate.validator', module: 'hibernate-validator'
        exclude group: 'jakarta.activation', module: 'jakarta.activation-api'
    }
    implementation('org.dom4j:dom4j') {
        exclude group: 'javax.xml.bind'
    }
    implementation ('jakarta.xml.bind:jakarta.xml.bind-api') {
        exclude group: 'jakarta.activation'
    }
    implementation ('org.springframework.boot:spring-boot-starter-data-jpa') {
        exclude group: 'org.hibernate'
    }
    implementation('org.eclipse.persistence:org.eclipse.persistence.jpa') {
        exclude group: 'org.eclipse.persistence', module: 'jakarta.persistence'
    }
    runtimeOnly('org.glassfish.jaxb:jaxb-runtime') {
        exclude group: 'com.sun.activation'
    }

    // runtimeOnly dependencies are things that Fineract code has no direct compile time dependency on, but which must be present at run-time
    runtimeOnly(

            // Although fineract (at the time of writing) doesn't have any compile time dep. on httpclient,
            // it's useful to have this for the Spring Boot TestRestTemplate http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-rest-templates-test-utility
            'org.apache.httpcomponents:httpclient'
            )

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    annotationProcessor 'org.mapstruct:mapstruct-processor'

    implementation 'ch.qos.logback.contrib:logback-json-classic'
    implementation 'ch.qos.logback.contrib:logback-jackson'
    implementation 'org.codehaus.janino:janino'

    implementation 'org.apache.commons:commons-math3'

    implementation 'io.github.classgraph:classgraph'
    // testCompile dependencies are ONLY used in src/test, not src/main.
    // Do NOT repeat dependencies which are ALREADY in implementation or runtimeOnly!
    //
    testImplementation( 'io.github.classgraph:classgraph')
    testImplementation ('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'com.jayway.jsonpath', module: 'json-path'
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        exclude group: 'jakarta.activation'
        exclude group: 'javax.activation'
        exclude group: 'org.skyscreamer'
    }
    implementation ('org.mnode.ical4j:ical4j') {
        exclude group: 'commons-logging'
        exclude group: 'javax.activation'
        exclude group: 'com.sun.mail', module: 'javax.mail'
    }
    implementation ('org.quartz-scheduler:quartz') {
        exclude group: 'com.zaxxer', module: 'HikariCP-java7'
    }
    testImplementation ('org.mockito:mockito-inline')
    implementation('org.apache.avro:avro')
    implementation(
            project(path: ':fineract-avro-schemas')
            )
}
