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

}
