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

import java.time.Instant
import java.time.LocalDate
import java.time.ZoneOffset
import java.time.format.DateTimeFormatter

Properties props = new Properties()
file('../gradle.properties').withInputStream {
    props.load(it)
}

ext {
    isReproducibleBuild = System.getenv("SOURCE_DATE_EPOCH") != null
    buildInstant = java.util.Optional.ofNullable(System.getenv('SOURCE_DATE_EPOCH'))
            .map(Long::parseLong)
            .map(Instant::ofEpochSecond)
            .orElseGet(Instant::now) as Instant
    formattedBuildDate = System.getenv("SOURCE_DATE_EPOCH") ?
            DateTimeFormatter.ISO_INSTANT.format(buildInstant) :
            DateTimeFormatter.ISO_DATE.format(LocalDate.ofInstant(buildInstant as Instant, ZoneOffset.UTC))
    buildDate = (buildInstant as Instant).atZone(ZoneOffset.UTC) // for reproducible builds
    isCiBuild = System.getenv().containsKey('CI')
}

allprojects {
    props.forEach { k, v ->
        if (!project.hasProperty(k as String)) {
            project.ext.set(k as String, v)
        }
    }

    tasks.withType(Test).configureEach { Task testTask ->
        testTask.dependsOn(
                gradle.includedBuild('grails-core').task(':publishAllPublicationsToTestCaseMavenRepoRepository'),
                gradle.includedBuild('grails-gradle').task(':publishAllPublicationsToTestCaseMavenRepoRepository')
        )
    }
}

subprojects {
    configurations.configureEach {
        resolutionStrategy {
            def cacheHours = isCiBuild || isReproducibleBuild ? 0 : 24
            cacheDynamicVersionsFor(cacheHours, 'hours')
            cacheChangingModulesFor(cacheHours, 'hours')
        }
    }
}

apply {
    // we must apply the publish configuration first or the docs config will not work
    from layout.projectDirectory.file('gradle/publish-root-config.gradle')
    from layout.projectDirectory.file('gradle/gradle-wrapper-root-config.gradle')
}