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

if (project.hasProperty('release') && jdkVersion != '8') {
  throw new GradleException("Releases must be built with Java 8")
}

subprojects {
  apply plugin: 'maven' // make pom files for deployment
  apply plugin: 'maven-publish'
  apply plugin: 'signing'

  task sourceJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
    group 'build'
  }

  task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
    group 'build'
  }

  task testJar(type: Jar) {
    archiveClassifier = 'tests'
    from sourceSets.test.output
  }

  artifacts {
    archives sourceJar
    archives javadocJar
    archives testJar
    testArtifacts testJar
  }

  // add LICENSE and NOTICE
  [jar, sourceJar, javadocJar, testJar].each { task ->
    task.from(rootDir) {
      include 'LICENSE'
      include 'NOTICE'
    }
  }

  publishing {
    publications {
      apache(MavenPublication) {
        if (tasks.matching({task -> task.name == 'shadowJar'}).isEmpty()) {
          from components.java
        } else {
          project.shadow.component(it)
        }

        artifact sourceJar
        artifact javadocJar
        artifact testJar

        versionMapping {
          allVariants {
            fromResolutionResult()
          }
        }

        groupId = 'org.apache.iceberg'
        pom {
          name = 'Apache Iceberg'
          description = 'A table format for huge analytic datasets'
          url = 'https://iceberg.apache.org'
          licenses {
            license {
              name = 'The Apache Software License, Version 2.0'
              url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
            }
          }
          mailingLists {
            mailingList {
              name = 'Dev Mailing List'
              post = 'dev@iceberg.apache.org'
              subscribe = 'dev-subscribe@iceberg.apache.org'
              unsubscribe = 'dev-unsubscribe@iceberg.apache.org'
            }
          }
          issueManagement {
            system = 'GitHub'
            url = 'https://github.com/apache/iceberg/issues'
          }
        }
      }
    }

    repositories {
      maven {
        credentials {
          username project.hasProperty('mavenUser') ? "$mavenUser" : ""
          password project.hasProperty('mavenPassword') ? "$mavenPassword" : ""
        }
        // upload to the releases repository using ./gradlew -Prelease publish
        def snapshotsRepoUrl = 'https://repository.apache.org/content/repositories/snapshots'
        def releasesRepoUrl = 'https://repository.apache.org/service/local/staging/deploy/maven2'
        url = project.hasProperty('release') ? releasesRepoUrl : snapshotsRepoUrl
      }
    }
  }

  if (project.hasProperty('release')) {
    signing {
      useGpgCmd()
      sign publishing.publications.apache
    }
  }
}
