package scientifik

import Scientifik
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.tasks.bundling.Jar
import org.gradle.api.tasks.testing.Test
import org.gradle.kotlin.dsl.*
import org.jetbrains.dokka.gradle.DokkaTask
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

open class ScientifikJVMPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        with(project) {
            plugins.apply("org.jetbrains.kotlin.jvm")

            repositories.applyRepos()

            extensions.findByType<JavaPluginExtension>()?.apply {
                targetCompatibility = Scientifik.JVM_TARGET
            }

            tasks.withType<KotlinCompile> {
                kotlinOptions {
                    jvmTarget = Scientifik.JVM_TARGET.toString()
                }
            }

            configure<KotlinJvmProjectExtension> {

                val sourceSet = sourceSets["main"].apply {
                    languageSettings.applySettings()
                    dependencies {
                        api(kotlin("stdlib-jdk8"))
                    }
                }

                sourceSets["test"].apply {
                    languageSettings.applySettings()
                    dependencies {
                        implementation(kotlin("test"))
//                        implementation(kotlin("test-junit"))
                        implementation(kotlin("test-junit5"))
                        implementation("org.junit.jupiter:junit-jupiter:5.6.1")
                    }
                }

                val sourcesJar by tasks.registering(Jar::class) {
                    archiveClassifier.set("sources")
                    from(sourceSet.kotlin.srcDirs.first())
                }

                pluginManager.withPlugin("maven-publish") {

                    configure<PublishingExtension> {
                        publications {
                            register("jvm", MavenPublication::class) {
                                from(components["java"])
                                artifact(sourcesJar.get())
                            }
                        }
                    }

                    pluginManager.withPlugin("org.jetbrains.dokka") {
                        logger.info("Adding dokka functionality to project ${this@with.name}")

                        val dokka by tasks.getting(DokkaTask::class) {
                            outputFormat = "html"
                            outputDirectory = "$buildDir/javadoc"
                        }

                        val kdocJar by tasks.registering(Jar::class) {
                            group = JavaBasePlugin.DOCUMENTATION_GROUP
                            dependsOn(dokka)
                            archiveClassifier.set("javadoc")
                            from("$buildDir/javadoc")
                        }

                        configure<PublishingExtension> {
                            publications {
                                getByName("jvm") {
                                    this as MavenPublication
                                    artifact(kdocJar.get())
                                }
                            }
                        }
                    }
                }
            }
            tasks.withType<Test>(){
                useJUnitPlatform()
            }
        }

    }
}