/**
 * 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 {
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")

    // 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 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-cache',
            'org.springframework.boot:spring-boot-starter-oauth2-resource-server',

            'org.glassfish.jersey.media:jersey-media-multipart:2.35',

            'org.springframework:spring-jms',
            'org.springframework:spring-context-support',

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

            'jakarta.jms:jakarta.jms-api',
            'jakarta.management.j2ee:jakarta.management.j2ee-api',

            'com.squareup.retrofit2:retrofit',
            'com.squareup.okhttp3:okhttp',
            'com.squareup.okhttp3:okhttp-urlconnection',

            'org.apache.commons:commons-lang3',
            'commons-io:commons-io',
            'org.apache.poi:poi',
            'org.apache.poi:poi-ooxml',
            'org.apache.tika:tika-core',

            'org.liquibase:liquibase-core',

            'com.github.librepdf:openpdf',
            'com.github.spullara.mustache.java:compiler',
            'com.jayway.jsonpath:json-path',

            'javax.cache:cache-api',

            'com.github.spotbugs:spotbugs-annotations',
            'io.swagger.core.v3:swagger-annotations',
            'org.webjars:webjars-locator-core',

            'com.google.cloud.sql:mysql-socket-factory-connector-j-8:1.4.4',
            'com.squareup.retrofit2:converter-gson',
            'org.apache.commons:commons-email'
            )

    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.apache.activemq:activemq-broker') {
        exclude group: 'org.apache.geronimo.specs'
    }
    implementation ('org.springframework.boot:spring-boot-starter-data-jpa') {
        exclude group: 'org.hibernate'
    }
    implementation('org.eclipse.persistence:org.eclipse.persistence.jpa:2.7.10') {
        exclude group: 'org.eclipse.persistence', module: 'jakarta.persistence'
    }
    implementation ('org.quartz-scheduler:quartz') {
        exclude group: 'com.zaxxer', module: 'HikariCP-java7'
    }
    implementation ('com.amazonaws:aws-java-sdk-s3') {
        exclude group: 'commons-logging'
    }
    implementation ('org.mnode.ical4j:ical4j') {
        exclude group: 'commons-logging'
        exclude group: 'javax.activation'
    }

    implementation ('org.ehcache:ehcache') {
        exclude group: 'com.sun.activation'
    }

    implementation('org.owasp.esapi:esapi:2.2.3.1') {
        exclude group: 'org.slf4j'
        exclude group: 'log4j'
        exclude group: 'commons-logging'
        exclude group: 'commons-collections'
        exclude group: 'commons-lang'
        exclude group: 'spotbugs-annotations'
        exclude group: 'xml-apis'
    }


    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(
            'org.apache.bval:org.apache.bval.bundle',
            'org.springframework.boot:spring-boot-starter-actuator',
            'org.webjars.npm:swagger-ui-dist',

            // 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'

    // testCompile dependencies are ONLY used in src/test, not src/main.
    // Do NOT repeat dependencies which are ALREADY in implementation or runtimeOnly!
    //
    testImplementation( 'io.cucumber:cucumber-spring',
            'io.github.classgraph:classgraph',
            project(':module:dummy:core'),
            project(':module:dummy:service'),
            project(':module:dummy:starter'),
            project(':custom:foo:service'),
            )
    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'
    }

}
