package ru.mipt.npm.gradle

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.testing.Test
import org.gradle.kotlin.dsl.*
import org.jetbrains.dokka.gradle.DokkaTask
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension

open class KScienceMPPlugin : Plugin<Project> {
    override fun apply(project: Project): Unit = project.run {

        plugins.apply("org.jetbrains.kotlin.multiplatform")
        val extension = extensions.add("kscience", KScienceExtension(this))

        repositories.applyRepos()

        configure<KotlinMultiplatformExtension> {
            explicitApiWarning()

            jvm {
                compilations.all {
                    kotlinOptions {
                        useIR = true
                        jvmTarget = KScienceVersions.JVM_TARGET.toString()
                    }
                }
            }

            js(IR) {
                browser {
                    webpackTask {
                        outputFileName = "main.bundle.js"
                    }
                    distribution {
                        directory = project.jsDistDirectory
                    }
                }
            }

            sourceSets.invoke {
                val commonMain by getting
                val commonTest by getting {
                    dependencies {
                        implementation(kotlin("test-common"))
                        implementation(kotlin("test-annotations-common"))
                    }
                }
                val jvmMain by getting
                val jvmTest by getting {
                    dependencies {
                        implementation(kotlin("test-junit5"))
                        implementation("org.junit.jupiter:junit-jupiter:5.6.1")
                    }
                }
                val jsMain by getting
                val jsTest by getting {
                    dependencies {
                        implementation(kotlin("test-js"))
                    }
                }
            }

            targets.all {
                sourceSets.all {
                    languageSettings.applySettings()
                }
            }

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

                val dokkaHtml by tasks.getting(DokkaTask::class) {
                    dokkaSourceSets {
                        configureEach {
                            jdkVersion = 11
                        }
                    }
                }
            }

            tasks.apply {
                withType<Test>() {
                    useJUnitPlatform()
                }

                val jsProcessResources by getting(Copy::class)
                jsProcessResources.copyJSResources(configurations["jsRuntimeClasspath"])

                val jvmProcessResources by getting(Copy::class)
                jvmProcessResources.copyJVMResources(configurations["jvmRuntimeClasspath"])

                findByName("jsBrowserDistribution")?.apply {
                    doLast {
                        val indexFile = project.jsDistDirectory.resolve("index.html")
                        if (indexFile.exists()) {
                            println("Run JS distribution at: ${indexFile.canonicalPath}")
                        }
                    }
                }
            }

        }
    }
}