/*
 * Quasseldroid - Quassel client for Android
 *
 * Copyright (c) 2021 Janne Mareike Koschinski
 * Copyright (c) 2021 The Quassel Project
 *
 * This program is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 3 as published
 * by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program. If not, see <http://www.gnu.org/licenses/>.
 */

package de.justjanne.coverageconverter

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.testing.jacoco.plugins.JacocoPluginExtension
import org.gradle.testing.jacoco.tasks.JacocoReport
import java.io.File

class CoverageConverterPlugin : Plugin<Project> {
  override fun apply(project: Project) {
    val extension = project.extensions.create("coverage", CoverageConverterExtension::class.java)

    if (extension.autoConfigureCoverage) {
      val jacocoPluginExtension = project.extensions.findByType(JacocoPluginExtension::class.java)
      if (jacocoPluginExtension != null) {
        jacocoPluginExtension.toolVersion = "0.8.3"
      }
    }

    project.afterEvaluate {
      val testTask = tasks.getByName("test")

      val jacocoReportTask = tasks.getByName("jacocoTestReport") as? JacocoReport
      if (jacocoReportTask != null) {
        jacocoReportTask.dependsOn(testTask)
        if (extension.autoConfigureCoverage) {
          jacocoReportTask.sourceDirectories.from(fileTree("src/main/kotlin"))
          jacocoReportTask.classDirectories.from(fileTree("build/classes"))
          jacocoReportTask.reports {
            xml.destination = File("${buildDir}/reports/jacoco/report.xml")
            html.isEnabled = true
            xml.isEnabled = true
            csv.isEnabled = false
          }
        }

        tasks.register("coberturaTestReport") {
          dependsOn(jacocoReportTask)
          mustRunAfter(jacocoReportTask)
          group = "verification"

          doLast(CoverageConverterAction(jacocoReportTask))
        }
      }
    }
  }
}