/*
 * 第 1 章 · Gradle 是什么 — 第一个 build.gradle.kts 示例
 *
 * 这是一个最小可跑的 Java 项目构建脚本，对照注释体会 Gradle DSL 的"声明 + 可编程"特性。
 *
 * 运行方式：
 *   1. 进入本目录
 *   2. 把这个文件叫 build.gradle.kts，并放一个 settings.gradle.kts 到同目录
 *   3. ./gradlew build      —— 编译 + 测试 + 打 jar
 *   4. ./gradlew tasks      —— 查看所有可用任务
 *   5. ./gradlew hello      —— 跑下面那个自定义的 hello 任务
 *   6. ./gradlew greet      —— 跑批量生成的任务之一
 *
 * 没有 wrapper？看第 2 章会教你怎么生成。
 */

// ============= 1. 应用插件 =============
// 插件给项目加上"能力"：java 插件让本项目可以编译 Java 代码
plugins {
    java
}

group = "com.example.gradle.intro"
version = "1.0.0"

// ============= 2. 配置 Java 编译 =============
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

// ============= 3. 配置仓库 =============
// 告诉 Gradle 去哪儿下载依赖。mavenCentral 是公认的全球最大 Java 库仓库
repositories {
    mavenCentral()
}

// ============= 4. 声明依赖 =============
dependencies {
    // 主代码用的依赖
    implementation("com.google.guava:guava:32.1.3-jre")

    // 测试代码才用的依赖
    testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
    testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

// ============= 5. 配置已有任务 =============
tasks.test {
    useJUnitPlatform()
}

// ============= 6. 自定义一个 Task =============
// 注册一个 "hello" 任务：跑 ./gradlew hello 时打印一句话
tasks.register("hello") {
    group = "intro"
    description = "第 1 章演示：打印 Hello Gradle"

    doLast {
        println("===========================================")
        println("  Hello Gradle!  这就是一个最简单的 Task")
        println("  当前项目：" + project.name + "，版本：" + project.version)
        println("===========================================")
    }
}

// ============= 7. 用循环批量生成任务（DSL = 代码） =============
// 这就是 Gradle 比 Maven 强的核心：build 脚本是 Kotlin 代码
val features = listOf("auth", "billing", "notification")
features.forEach { feature ->
    tasks.register("greet-" + feature) {
        group = "intro"
        description = "对 " + feature + " 模块说 Hello"

        doLast {
            println("👋 Hello, " + feature + " module!")
        }
    }
}

// ============= 8. 一个聚合任务 =============
// 跑 ./gradlew greet 会依次跑 greet-auth、greet-billing、greet-notification
tasks.register("greet") {
    group = "intro"
    description = "向所有 feature 模块打招呼"
    dependsOn(features.map { "greet-" + it })
}
