/*
 * 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) {
      archiveClassifier.set('sources')
      from sourceSets.main.allSource
      group 'build'
    }

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

    task testJar(type: Jar) {
      archiveClassifier.set('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
      }
    }
  }
}
