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

buildscript {
    repositories {
        jcenter()
    }
    dependencies {

    }
}

plugins {
    id 'com.github.hierynomus.license' version '0.15.0'
    id("org.nosphere.apache.rat") version "0.6.0"
    id "com.jfrog.artifactory" version "4.15.1"
    id "io.spring.dependency-management" version "1.0.10.RELEASE"
    id 'maven-publish'
    id 'idea'
    id 'java'
}

group 'org.apache.fineract.cn'
version 'spring_boot_2-SNAPSHOT'

ext.versions = [
        springcontext        : '5.3.2',
        springboot           : '2.4.1',
        feigngson            : '8.18.0',
        spotbugs             : '4.2.0',
        frameworklangversion : 'spring_boot_2-SNAPSHOT'
]

apply plugin: 'io.spring.dependency-management'

tasks.withType(JavaCompile) {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

repositories {
    jcenter()
    mavenLocal()
    maven { url 'https://mifos.jfrog.io/mifos/libs-snapshot/' }
}

dependencyManagement {
    imports {
        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR9'
    }
}

dependencies {
    implementation(
            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign'],
            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-eureka-client'],
            [group: 'org.springframework', name: 'spring-context', version: versions.springcontext],
            [group: 'com.github.spotbugs', name: 'spotbugs', version: versions.spotbugs],
            [group: 'com.netflix.feign', name: 'feign-gson', version: versions.feigngson],
            [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklangversion],
    )

    testImplementation(
            [group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: versions.springboot]
    )
}

jar {
    from sourceSets.main.java
}

publishing {
    publications {
        apiPublication(MavenPublication) {
            from components.java
            groupId project.group
            artifactId project.name
            version findProperty('externalVersion') ?: project.version
        }
    }
}

artifactory {
    contextUrl = System.getenv("ARTIFACTORY_URL")
    publish {
        repository {
            repoKey = project.findProperty('artifactoryRepoKey')
            username = System.getenv("ARTIFACTORY_USER")
            password = System.getenv("ARTIFACTORY_PASSWORD")
        }

        defaults {
            publications ('apiPublication')
        }
    }
}
artifactoryPublish.dependsOn('clean','publishToMavenLocal')


license {
    header rootProject.file('HEADER')
    strictCheck true
    mapping {
        java = 'SLASHSTAR_STYLE'
    }
}


rat {
    // List of exclude directives, defaults to ['**/.gradle/**']
    excludes = [
            ".idea/**",
            ".gradle/**",
            "gradle/**",
            "build/**",
            "gradlew",
            "gradlew.bat",
            "README.md",
            ".project",
            "bin/**",
            ".classpath",
            ".settings/**"
    ]
}
