/*
 * 第 3 章 · 核心概念演示 — build.gradle.kts
 *
 * 这个脚本演示了 Project / Task / Plugin / 生命周期的所有核心点。
 * 跑下面任意一条命令，对照注释观察输出：
 *
 *   ./gradlew tasks                  → 看到所有自定义 task
 *   ./gradlew lifecycleDemo          → 看 doFirst/doLast 顺序
 *   ./gradlew chained                → 看 dependsOn 触发链
 *   ./gradlew pipeline               → 看复杂 DAG
 *   ./gradlew clean lifecycleDemo    → 看多个 task 的执行顺序
 */

plugins {
    base   // base 插件提供 clean / assemble / check / build 这些聚合任务
}

// ============================================================================
// 1. 配置阶段会执行的代码（脚本顶层）
// ============================================================================
println("[CONFIG] 我在配置阶段就执行了！只要你跑任何 ./gradlew 命令我都会跑")
println("[CONFIG] Project name: " + project.name)
println("[CONFIG] Project version: " + project.version)

// ============================================================================
// 2. 演示：doFirst / doLast 的顺序
// ============================================================================
tasks.register("lifecycleDemo") {
    group = "ch03-demo"
    description = "演示 doFirst / doLast 顺序"

    println("[CONFIG] register 闭包里的 println 也是配置阶段")

    // 注册多个 doFirst（后加的在前）
    doFirst { println("[EXEC] doFirst-A (第一次写)") }
    doFirst { println("[EXEC] doFirst-B (第二次写)") }
    doFirst { println("[EXEC] doFirst-C (第三次写) ← 最后写的会最先执行") }

    // 注册多个 doLast（按写入顺序）
    doLast  { println("[EXEC] doLast-X (第一次写) ← 第一次写的会最先执行") }
    doLast  { println("[EXEC] doLast-Y (第二次写)") }
    doLast  { println("[EXEC] doLast-Z (第三次写)") }
}

// ============================================================================
// 3. 演示：Task 之间的依赖（dependsOn）
// ============================================================================
tasks.register("step1") {
    group = "ch03-demo"
    doLast { println("⚙️  Step 1 done") }
}

tasks.register("step2") {
    group = "ch03-demo"
    dependsOn("step1")
    doLast { println("⚙️  Step 2 done") }
}

tasks.register("step3") {
    group = "ch03-demo"
    dependsOn("step2")
    doLast { println("⚙️  Step 3 done") }
}

tasks.register("chained") {
    group = "ch03-demo"
    description = "跑这个会触发 step1 → step2 → step3"
    dependsOn("step3")
    doLast { println("✅ All steps complete") }
}

// ============================================================================
// 4. 演示：mustRunAfter（弱顺序）
// ============================================================================
tasks.register("test1") {
    group = "ch03-demo"
    doLast { println("🧪 test1 running...") }
}

tasks.register("test2") {
    group = "ch03-demo"
    mustRunAfter("test1")  // 仅在两者都跑时，test2 必须在 test1 之后
    doLast { println("🧪 test2 running...") }
}

// ============================================================================
// 5. 演示：finalizedBy（终结依赖）
// ============================================================================
tasks.register("upload") {
    group = "ch03-demo"
    finalizedBy("cleanup")
    doLast { println("📤 Uploading... (假装上传文件)") }
}

tasks.register("cleanup") {
    group = "ch03-demo"
    doLast { println("🧹 Cleanup running... (即使 upload 失败也会跑)") }
}

// ============================================================================
// 6. 演示：典型 Typed Task（Copy）
// ============================================================================
tasks.register<Copy>("copyDocs") {
    group = "ch03-demo"
    description = "演示 Copy 类型的 Task"

    from("src")
    into(layout.buildDirectory.dir("copied-src"))
    include("**/*.kt", "**/*.java")
}

// ============================================================================
// 7. 综合演示：模拟一个 CI pipeline
// ============================================================================
tasks.register("compile") { group = "pipeline"; doLast { println("📦 compile") } }
tasks.register("unitTest") { group = "pipeline"; dependsOn("compile"); doLast { println("✅ unitTest") } }
tasks.register("lint")     { group = "pipeline"; dependsOn("compile"); doLast { println("🔍 lint") } }
tasks.register("packageApp") {
    group = "pipeline"
    dependsOn("compile")
    doLast { println("📦 packageApp") }
}
tasks.register("deploy") {
    group = "pipeline"
    dependsOn("unitTest", "lint", "packageApp")  // 三个并行依赖
    doLast { println("🚀 deploy DONE") }
}

tasks.register("pipeline") {
    group = "ch03-demo"
    description = "一个完整的 mock CI 流水线"
    dependsOn("deploy")
}

// ============================================================================
// 8. 演示：用循环动态生成 Task
// ============================================================================
val features = listOf("auth", "billing", "notification", "payment", "search")
features.forEach { feature ->
    tasks.register("test-" + feature) {
        group = "feature-test"
        doLast { println("🧪 Testing feature: " + feature) }
    }
}

// 一个聚合任务，按顺序触发所有 feature 测试
tasks.register("testAllFeatures") {
    group = "ch03-demo"
    description = "测试所有 feature"
    dependsOn(features.map { "test-" + it })
}

println("[CONFIG] 脚本结尾的 println，配置阶段执行")
