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

rootProject.name = 'iceberg'
include 'api'
include 'common'
include 'core'
include 'data'
include 'aliyun'
include 'aws'
include 'orc'
include 'arrow'
include 'parquet'
include 'bundled-guava'
include 'spark'
include 'pig'
include 'hive-metastore'
include 'nessie'
include 'gcp'
include 'dell'
include 'snowflake'
include 'delta-lake'

project(':api').name = 'iceberg-api'
project(':common').name = 'iceberg-common'
project(':core').name = 'iceberg-core'
project(':data').name = 'iceberg-data'
project(':aliyun').name = 'iceberg-aliyun'
project(':aws').name = 'iceberg-aws'
project(':orc').name = 'iceberg-orc'
project(':arrow').name = 'iceberg-arrow'
project(':parquet').name = 'iceberg-parquet'
project(':bundled-guava').name = 'iceberg-bundled-guava'
project(':spark').name = 'iceberg-spark'
project(':pig').name = 'iceberg-pig'
project(':hive-metastore').name = 'iceberg-hive-metastore'
project(':nessie').name = 'iceberg-nessie'
project(':gcp').name = 'iceberg-gcp'
project(':dell').name = 'iceberg-dell'
project(':snowflake').name = 'iceberg-snowflake'
project(':delta-lake').name = 'iceberg-delta-lake'

if (null != System.getProperty("allVersions")) {
  System.setProperty("flinkVersions", System.getProperty("knownFlinkVersions"))
  System.setProperty("sparkVersions", System.getProperty("knownSparkVersions"))
  System.setProperty("hiveVersions", System.getProperty("knownHiveVersions"))
}

List<String> knownFlinkVersions = System.getProperty("knownFlinkVersions").split(",")
String flinkVersionsString = System.getProperty("flinkVersions") != null ? System.getProperty("flinkVersions") : System.getProperty("defaultFlinkVersions")
List<String> flinkVersions = flinkVersionsString != null && !flinkVersionsString.isEmpty() ? flinkVersionsString.split(",") : []

if (!knownFlinkVersions.containsAll(flinkVersions)) {
  throw new GradleException("Found unsupported Flink versions: " + (flinkVersions - knownFlinkVersions))
}

List<String> knownHiveVersions = System.getProperty("knownHiveVersions").split(",")
String hiveVersionsString = System.getProperty("hiveVersions") != null ? System.getProperty("hiveVersions") : System.getProperty("defaultHiveVersions")
List<String> hiveVersions = hiveVersionsString != null && !hiveVersionsString.isEmpty() ? hiveVersionsString.split(",") : []

if (!knownHiveVersions.containsAll(hiveVersions)) {
  throw new GradleException("Found unsupported Hive versions: " + (hiveVersions - knownHiveVersions))
}

List<String> knownSparkVersions = System.getProperty("knownSparkVersions").split(",")
String sparkVersionsString = System.getProperty("sparkVersions") != null ? System.getProperty("sparkVersions") : System.getProperty("defaultSparkVersions")
List<String> sparkVersions = sparkVersionsString != null && !sparkVersionsString.isEmpty() ? sparkVersionsString.split(",") : []

if (!knownSparkVersions.containsAll(sparkVersions)) {
  throw new GradleException("Found unsupported Spark versions: " + (sparkVersions - knownSparkVersions))
}

List<String> knownScalaVersions = System.getProperty("knownScalaVersions").split(",")
String scalaVersion = System.getProperty("scalaVersion") != null ? System.getProperty("scalaVersion") : System.getProperty("defaultScalaVersion")

if (!knownScalaVersions.contains(scalaVersion)) {
  throw new GradleException("Found unsupported Scala version: " + scalaVersion)
}

if (!flinkVersions.isEmpty()) {
  include 'flink'
  project(':flink').name = 'iceberg-flink'
}

if (flinkVersions.contains("1.15")) {
  include ":iceberg-flink:flink-1.15"
  include ":iceberg-flink:flink-runtime-1.15"
  project(":iceberg-flink:flink-1.15").projectDir = file('flink/v1.15/flink')
  project(":iceberg-flink:flink-1.15").name = "iceberg-flink-1.15"
  project(":iceberg-flink:flink-runtime-1.15").projectDir = file('flink/v1.15/flink-runtime')
  project(":iceberg-flink:flink-runtime-1.15").name = "iceberg-flink-runtime-1.15"
}

if (flinkVersions.contains("1.16")) {
  include ":iceberg-flink:flink-1.16"
  include ":iceberg-flink:flink-runtime-1.16"
  project(":iceberg-flink:flink-1.16").projectDir = file('flink/v1.16/flink')
  project(":iceberg-flink:flink-1.16").name = "iceberg-flink-1.16"
  project(":iceberg-flink:flink-runtime-1.16").projectDir = file('flink/v1.16/flink-runtime')
  project(":iceberg-flink:flink-runtime-1.16").name = "iceberg-flink-runtime-1.16"
}

if (flinkVersions.contains("1.17")) {
  include ":iceberg-flink:flink-1.17"
  include ":iceberg-flink:flink-runtime-1.17"
  project(":iceberg-flink:flink-1.17").projectDir = file('flink/v1.17/flink')
  project(":iceberg-flink:flink-1.17").name = "iceberg-flink-1.17"
  project(":iceberg-flink:flink-runtime-1.17").projectDir = file('flink/v1.17/flink-runtime')
  project(":iceberg-flink:flink-runtime-1.17").name = "iceberg-flink-runtime-1.17"
}

if (sparkVersions.contains("3.1")) {
  include ':iceberg-spark:spark-3.1_2.12'
  include ':iceberg-spark:spark-extensions-3.1_2.12'
  include ':iceberg-spark:spark-runtime-3.1_2.12'
  project(':iceberg-spark:spark-3.1_2.12').projectDir = file('spark/v3.1/spark')
  project(':iceberg-spark:spark-3.1_2.12').name = 'iceberg-spark-3.1_2.12'
  project(':iceberg-spark:spark-extensions-3.1_2.12').projectDir = file('spark/v3.1/spark-extensions')
  project(':iceberg-spark:spark-extensions-3.1_2.12').name = 'iceberg-spark-extensions-3.1_2.12'
  project(':iceberg-spark:spark-runtime-3.1_2.12').projectDir = file('spark/v3.1/spark-runtime')
  project(':iceberg-spark:spark-runtime-3.1_2.12').name = 'iceberg-spark-runtime-3.1_2.12'
}

if (sparkVersions.contains("3.2")) {
  include ":iceberg-spark:spark-3.2_${scalaVersion}"
  include ":iceberg-spark:spark-extensions-3.2_${scalaVersion}"
  include ":iceberg-spark:spark-runtime-3.2_${scalaVersion}"
  project(":iceberg-spark:spark-3.2_${scalaVersion}").projectDir = file('spark/v3.2/spark')
  project(":iceberg-spark:spark-3.2_${scalaVersion}").name = "iceberg-spark-3.2_${scalaVersion}"
  project(":iceberg-spark:spark-extensions-3.2_${scalaVersion}").projectDir = file('spark/v3.2/spark-extensions')
  project(":iceberg-spark:spark-extensions-3.2_${scalaVersion}").name = "iceberg-spark-extensions-3.2_${scalaVersion}"
  project(":iceberg-spark:spark-runtime-3.2_${scalaVersion}").projectDir = file('spark/v3.2/spark-runtime')
  project(":iceberg-spark:spark-runtime-3.2_${scalaVersion}").name = "iceberg-spark-runtime-3.2_${scalaVersion}"
}

if (sparkVersions.contains("3.3")) {
  include ":iceberg-spark:spark-3.3_${scalaVersion}"
  include ":iceberg-spark:spark-extensions-3.3_${scalaVersion}"
  include ":iceberg-spark:spark-runtime-3.3_${scalaVersion}"
  project(":iceberg-spark:spark-3.3_${scalaVersion}").projectDir = file('spark/v3.3/spark')
  project(":iceberg-spark:spark-3.3_${scalaVersion}").name = "iceberg-spark-3.3_${scalaVersion}"
  project(":iceberg-spark:spark-extensions-3.3_${scalaVersion}").projectDir = file('spark/v3.3/spark-extensions')
  project(":iceberg-spark:spark-extensions-3.3_${scalaVersion}").name = "iceberg-spark-extensions-3.3_${scalaVersion}"
  project(":iceberg-spark:spark-runtime-3.3_${scalaVersion}").projectDir = file('spark/v3.3/spark-runtime')
  project(":iceberg-spark:spark-runtime-3.3_${scalaVersion}").name = "iceberg-spark-runtime-3.3_${scalaVersion}"
}

if (sparkVersions.contains("3.4")) {
  include ":iceberg-spark:spark-3.4_${scalaVersion}"
  include ":iceberg-spark:spark-extensions-3.4_${scalaVersion}"
  include ":iceberg-spark:spark-runtime-3.4_${scalaVersion}"
  project(":iceberg-spark:spark-3.4_${scalaVersion}").projectDir = file('spark/v3.4/spark')
  project(":iceberg-spark:spark-3.4_${scalaVersion}").name = "iceberg-spark-3.4_${scalaVersion}"
  project(":iceberg-spark:spark-extensions-3.4_${scalaVersion}").projectDir = file('spark/v3.4/spark-extensions')
  project(":iceberg-spark:spark-extensions-3.4_${scalaVersion}").name = "iceberg-spark-extensions-3.4_${scalaVersion}"
  project(":iceberg-spark:spark-runtime-3.4_${scalaVersion}").projectDir = file('spark/v3.4/spark-runtime')
  project(":iceberg-spark:spark-runtime-3.4_${scalaVersion}").name = "iceberg-spark-runtime-3.4_${scalaVersion}"
}

// hive 3 depends on hive 2, so always add hive 2 if hive3 is enabled
if (hiveVersions.contains("2") || hiveVersions.contains("3")) {
  include 'mr'
  include 'hive-runtime'

  project(':mr').name = 'iceberg-mr'
  project(':hive-runtime').name = 'iceberg-hive-runtime'
}

if (JavaVersion.current() == JavaVersion.VERSION_1_8) {
  if (hiveVersions.contains("3")) {
    include 'hive3'
    include 'hive3-orc-bundle'

    project(':hive3').name = 'iceberg-hive3'
    project(':hive3-orc-bundle').name = 'iceberg-hive3-orc-bundle'
  }
}

