/*
 * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
 * that can be found in the license/LICENSE.txt file.
 */

package org.jetbrains.kotlin.gradle.plugin.mpp

import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet

object UnusedSourceSetsChecker {
    const val WARNING_PREFIX_ONE =
        "The Kotlin source set"

    const val WARNING_PREFIX_MANY =
        "The following Kotlin source sets were"

    const val WARNING_INTRO = "configured but not added to any Kotlin compilation"

    const val WARNING_BOTTOM_LINE =
        "You can add a source set to a target's compilation by connecting it with the compilation's default source set using 'dependsOn'.\n" +
                "See https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#connecting-source-sets"

    private fun reportUnusedSourceSets(project: Project, sourceSets: Set<KotlinSourceSet>) {
        require(sourceSets.isNotEmpty())
        val message = when (sourceSets.size) {
            1 -> "$WARNING_PREFIX_ONE ${sourceSets.single().name} was $WARNING_INTRO. $WARNING_BOTTOM_LINE"
            else -> {
                val list = sourceSets.joinToString("\n", "\n", "\n") { " * ${it.name}" }
                "$WARNING_PREFIX_MANY $WARNING_INTRO:$list$WARNING_BOTTOM_LINE"
            }
        }
        project.logger.warn("\n" + message) // make sure the message stands out
    }

    fun checkSourceSets(project: Project) {
        // TODO once Android compilations are configured eagerly, move this to afterEvaluate { ... } instead of taskGraph.whenReady { ... }
        project.gradle.taskGraph.whenReady { _ ->
            val compilationsBySourceSet = compilationsBySourceSet(project)
            val unusedSourceSets = project.kotlinExtension.sourceSets.filter {
                compilationsBySourceSet[it]?.isEmpty() ?: true
            }
            if (unusedSourceSets.isNotEmpty()) {
                reportUnusedSourceSets(project, unusedSourceSets.toSet())
            }
        }
    }
}