/*
 * 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 {
    ext {
        springBootVersion = '1.4.1.RELEASE'
    }

    repositories {
        jcenter()
    }
}

plugins {
    id "com.github.hierynomus.license" version "0.13.1"
    id("org.nosphere.apache.rat") version "0.5.2"
    id "com.jfrog.artifactory" version "4.9.5"
    id "org.springframework.boot" version "1.4.3.RELEASE"
    id 'maven-publish'
    id 'java'
    id 'idea'
}

apply from: '../shared.gradle'
apply plugin: 'project-report'

bootRepackage {
    enabled = true
    classifier = 'boot'
}

dependencies {
    compile(
            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-config'],
            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka'],
            [group: 'org.springframework.boot', name: 'spring-boot-starter-jetty'],
            [group: 'org.apache.fineract.cn.deposit-account-management', name: 'api', version: project.version],
            [group: 'org.apache.fineract.cn.anubis', name: 'library', version: versions.frameworkanubis],
            [group: 'com.google.code.gson', name: 'gson'],
            [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklang],
            [group: 'org.apache.fineract.cn', name: 'async', version: versions.frameworkasync],
            [group: 'org.apache.fineract.cn', name: 'cassandra', version: versions.frameworkcassandra],
            [group: 'org.apache.fineract.cn', name: 'postgresql', version: versions.frameworkpostgresql],
            [group: 'org.apache.fineract.cn', name: 'command', version: versions.frameworkcommand],
            [group: 'org.apache.fineract.cn.accounting', name: 'api', version: versions.frameworkledger],
            [group: 'org.apache.fineract.cn.rhythm', name: 'spi', version: versions.frameworkrhythm],
            [group: 'org.apache.fineract.cn.rhythm', name: 'api', version: versions.frameworkrhythm],
            [group: 'org.hibernate', name: 'hibernate-validator', version: versions.validator],
            [group: 'org.threeten', name: 'threeten-extra', version: '1.2'],
            [group: 'io.netty', name: 'netty-all', version: '4.1.39.Final'],
            [group: 'io.netty', name: 'netty-transport-native-epoll', version: '4.1.39.Final']
    )
}

tasks.withType(PublishToMavenLocal) { task ->
    task.dependsOn 'bootRepackage'
}

publishing {
    publications {
        service(MavenPublication) {
            from components.java
            groupId project.group
            artifactId project.name
            version project.findProperty('externalVersion') ?: project.version
        }
        bootService(MavenPublication) {
            // "boot" jar
            artifact(file("$buildDir/libs/$project.name-$project.version-${bootRepackage.classifier}.jar"))
            groupId project.group
            artifactId("$project.name-boot")
            version project.findProperty('externalVersion') ?: project.version
        }
    }
}
