/*
 * 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-publish'
  apply plugin: 'signing'
  afterEvaluate {

    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.dependsOn rootProject.tasks.buildInfo
      task.from("${rootDir}/build") {
        include 'iceberg-build.properties'
      }
      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 apacheSnapshotsRepoUrl = 'https://repository.apache.org/content/repositories/snapshots'
          def apacheReleasesRepoUrl = 'https://repository.apache.org/service/local/staging/deploy/maven2'
          def snapshotsRepoUrl = project.hasProperty('mavenSnapshotsRepo') ? "$mavenSnapshotsRepo" : "$apacheSnapshotsRepoUrl"
          def releasesRepoUrl = project.hasProperty('mavenReleasesRepo') ? "$mavenReleasesRepo" : "$apacheReleasesRepoUrl"
          url = project.hasProperty('release') ? releasesRepoUrl : snapshotsRepoUrl
        }
      }
    }

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