/**
 * 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.springframework.boot:spring-boot-starter-actuator',

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

            '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.apache.tika:tika-parser-microsoft-module',
            'org.apache.tika:tika-parser-miscoffice-module',

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

            'com.google.cloud.sql:mysql-socket-factory-connector-j-8',
            'com.squareup.retrofit2:converter-gson',
            'com.sun.activation:jakarta.activation',
            'com.sun.mail:jakarta.mail',

            'org.springdoc:springdoc-openapi-ui',
            'org.springdoc:springdoc-openapi-common',
            'org.springdoc:springdoc-openapi-security',
            'org.mapstruct:mapstruct',
            )

    implementation ('org.apache.commons:commons-email') {
        exclude group: 'com.sun.mail', module: 'javax.mail'
        exclude group: 'javax.activation', module: 'activation'
    }

    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'
        exclude group: 'javax.annotation', module: 'javax.annotation-api'
    }
    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.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'
        exclude group: 'com.sun.mail', module: 'javax.mail'
    }

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

    implementation('org.owasp.esapi:esapi') {
        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',

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

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

}
