/*
 * 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 != '17') {
  throw new GradleException("Releases must be built with Java 17")
}

subprojects {
  def isBom = it.name == 'iceberg-bom'
  def isOpenApi = it.name == 'iceberg-open-api'

  apply plugin: 'maven-publish'
  apply plugin: 'signing'
  afterEvaluate {

    if (!isBom) {
      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 (isBom) {
            from components.javaPlatform
          } else if (isOpenApi) {
            artifact testJar
            artifact testFixturesJar
            artifact shadowJar
          } else {
            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
      }
    }
  }
}
