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

//=============================================================================
// Plugins
//=============================================================================
plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '1.2.2'
}
apply plugin: 'com.google.protobuf'

//=============================================================================
// Project Level Settings
//=============================================================================
version = 0.1
sourceCompatibility = 1.7
targetCompatibility = 1.7
def title = 'Apache Wave PST Compiler'
def vendor = 'The Apache Software Foundation'

jar {
    manifest {
        attributes "Specification-Vendor": vendor,
                "Specification-Title": title,
                "Specification-Version": version,
                "Implementation-Vendor": vendor,
                "Implementation-Title": title,
                "Implementation-Version": version,
                "Built-By": "No one in particular",
                "Main-Class": "org.apache.wave.pst.PstMain"
    }
}

//=============================================================================
// Source's
//=============================================================================
sourceSets {
    main {
        java {
            srcDirs = [
                    'src/main/java',
                    'generated/main/java'
            ]
        }
        proto {
            srcDir 'src/main/proto'
        }
    }

    test {
        java {
            srcDir 'src/test/java'
        }
    }
}

//=============================================================================
// Dependencies
// Note: next to each dependency is a review stamp [last review, next review].
//       If a dependency is past its review date pls create a jira issue.
//       https://issues.apache.org/jira/browse/WAVE
//=============================================================================
repositories {
    mavenCentral()
}

dependencies {
    compile group: 'com.google.protobuf', name: 'protobuf-java', version: '2.6.1' // [12/2015, 3/2016]
    compile group: 'com.google.guava', name: 'guava', version: '19.0'             // [1/2016, 6/2016]
    compile group: 'org.antlr', name: 'antlr', version: '3.2'                     // [12/2015, 3/2016]
    compile group: 'commons-cli', name: 'commons-cli', version: '1.3.1'           // [1/2016, 6/2016]

    testCompile group: 'junit', name: 'junit', version: '4.12'                    // [1/2016, 1/2017]
}

//=============================================================================
// Protobuf Config
//=============================================================================
protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:2.6.1'
    }
    generatedFilesBaseDir = "$projectDir/generated"
}

//=============================================================================
// UberJar (shadowJar) config
//=============================================================================

shadowJar {
    baseName = 'wave-pst'
    classifier = ''
    exclude 'META-INF/**/*'
}

//=============================================================================
// Clean - Must remove generated sources.
//=============================================================================
clean {
    delete "generated/"
}

//=============================================================================
// Source Distribution
//=============================================================================

def srcName = this.group + "-" + this.name + "-src"
def srcExcludes = [
        'build/*',
        '*.iml'
]

task createDistSourceTar(type: Tar) {
    compression = Compression.GZIP
    extension = 'tar.gz'
    baseName = srcName
    destinationDir = file('../distributions')
    from('./') {
        into 'apache-wave-pst-src'
    }
    excludes = srcExcludes

}

task createDistSourceZip(type: Zip) {
    baseName = srcName
    destinationDir = file('../distributions')
    from('./') {
        into 'apache-wave-pst-src'
    }
    excludes = srcExcludes
}

task createDistSource() {
    doFirst {
        println ''
        println '--------------------------------------------------------'
        println '     Creating Deployment Source - Apache Wave PST       '
        println '--------------------------------------------------------'
        println ''
    }
}

createDistSource.dependsOn createDistSourceTar, createDistSourceZip

//=============================================================================
// Binary Distribution
//=============================================================================

def binName = this.group + "-" + this.name + "-bin"

task createDistBinTar(type: Tar) {
    compression = Compression.GZIP
    extension = 'tar.gz'
    baseName = binName
    destinationDir = file('../distributions')
    from(shadowJar) {
        into 'apache-wave-pst/bin'
    }
    from('src/dist') {
        into 'apache-wave-pst'
    }
}

task createDistBinZip(type: Zip) {
    baseName = binName
    destinationDir = file('../distributions')
    from(shadowJar) {
        into 'apache-wave-pst/bin'
    }
    from('src/dist') {
        into 'apache-wave-pst'
    }
}

task createDistBin() {
    doFirst {
        println ''
        println '--------------------------------------------------------'
        println '     Creating Deployment Binary - Apache Wave PST       '
        println '--------------------------------------------------------'
        println ''
    }
}

createDistBin.dependsOn createDistBinTar, createDistBinZip

//=============================================================================
// Distribution's
//=============================================================================

task createDist() {
    doFirst {
        println ''
        println '--------------------------------------------------------'
        println '      Creating Deployments - Apache Wave PST            '
        println '--------------------------------------------------------'
        println ''
    }
}

createDist.dependsOn createDistSource, createDistBin