package ru.mipt.npm.gradle

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.jvm.tasks.Jar
import org.gradle.kotlin.dsl.*
import org.gradle.plugins.signing.SigningExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension


open class KSciencePublishPlugin : Plugin<Project> {

    override fun apply(project: Project): Unit = project.plugins.withId("ru.mipt.npm.kscience") {
        project.run {
            if (plugins.findPlugin("maven-publish") == null) {
                plugins.apply("maven-publish")
            }

            val githubOrg: String = project.findProperty("githubOrg") as? String ?: "mipt-npm"
            val githubProject: String? by project
            val vcs = findProperty("vcs") as? String
                ?: githubProject?.let { "https://github.com/$githubOrg/$it" }

//    if (vcs == null) {
//        project.logger.warn("[${project.name}] Missing deployment configuration. Skipping publish.")
//        return
//    }

            project.configure<PublishingExtension> {
                plugins.withId("org.jetbrains.kotlin.js") {
                    val kotlin = extensions.findByType<KotlinJsProjectExtension>()!!

                    val sourcesJar: Jar by project.tasks.creating(Jar::class) {
                        archiveClassifier.set("sources")
                        from(kotlin.sourceSets["main"].kotlin)
                    }

                    publications {
                        create("js", MavenPublication::class) {
                            from(components["kotlin"])
                            artifact(sourcesJar)
                        }
                    }
                }

                plugins.withId("org.jetbrains.kotlin.jvm") {
                    val kotlin = extensions.findByType<KotlinJvmProjectExtension>()!!

                    val sourcesJar: Jar by project.tasks.creating(Jar::class) {
                        archiveClassifier.set("sources")
                        from(kotlin.sourceSets["main"].kotlin)
                    }

                    publications {
                        create("jvm", MavenPublication::class) {
                            from(components["kotlin"])
                            artifact(sourcesJar)
                        }
                    }
                }


                // Process each publication we have in this project
                publications.withType<MavenPublication>().forEach { publication ->
                    publication.pom {
                        name.set(project.name)
                        description.set(project.description)
                        vcs?.let { url.set(vcs) }

                        licenses {
                            license {
                                name.set("The Apache Software License, Version 2.0")
                                url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
                                distribution.set("repo")
                            }
                        }
                        developers {
                            developer {
                                id.set("MIPT-NPM")
                                name.set("MIPT nuclear physics methods laboratory")
                                organization.set("MIPT")
                                organizationUrl.set("http://npm.mipt.ru")
                            }

                        }
                        vcs?.let {
                            scm {
                                url.set(vcs)
                                tag.set(project.version.toString())
                                //developerConnection = "scm:git:[fetch=]/*ВАША ССЫЛКА НА .git файл*/[push=]/*Повторить предыдущую ссылку*/"
                            }
                        }
                    }
                }

                val githubUser: String? by project
                val githubToken: String? by project

                if (githubProject != null && githubUser != null && githubToken != null) {
                    project.logger.info("Adding github publishing to project [${project.name}]")
                    repositories {
                        maven {
                            name = "github"
                            url = uri("https://maven.pkg.github.com/mipt-npm/$githubProject/")
                            credentials {
                                username = githubUser
                                password = githubToken
                            }
                        }
                    }
                }

                val spaceRepo: String? by project
                val spaceUser: String? by project
                val spaceToken: String? by project

                if (spaceRepo != null && spaceUser != null && spaceToken != null) {
                    project.logger.info("Adding mipt-npm Space publishing to project [${project.name}]")
                    repositories {
                        maven {
                            name = "space"
                            url = uri(spaceRepo!!)
                            credentials {
                                username = spaceUser
                                password = spaceToken
                            }

                        }
                    }
                }

                val bintrayOrg = project.findProperty("bintrayOrg") as? String ?: "mipt-npm"
                val bintrayUser: String? by project
                val bintrayApiKey: String? by project


                val bintrayRepo = if (project.version.toString().contains("dev")) {
                    "dev"
                } else {
                    findProperty("bintrayRepo") as? String
                }

                val projectName = project.name

                if (bintrayRepo != null && bintrayUser != null && bintrayApiKey != null) {
                    project.logger.info("Adding bintray publishing to project [$projectName]")

                    repositories {
                        maven {
                            name = "bintray"
                            url = uri(
                                "https://api.bintray.com/maven/$bintrayOrg/$bintrayRepo/$projectName/;publish=1;override=1"
                            )
                            credentials {
                                username = bintrayUser
                                password = bintrayApiKey
                            }
                        }
                    }
                }

                val sonatypeUser: String? by project
                val sonatypePassword: String? by project

                if (sonatypeUser != null && sonatypePassword != null) {
                    val sonatypeRepo: String = if (project.version.toString().contains("dev")) {
                        "https://oss.sonatype.org/content/repositories/snapshots"
                    } else {
                        "https://oss.sonatype.org/service/local/staging/deploy/maven2"
                    }

                    if (plugins.findPlugin("signing") == null) {
                        plugins.apply("signing")
                    }

                    extensions.findByType<SigningExtension>()?.apply {
                        useGpgCmd()
                        sign(publications)
                    }

                    repositories {
                        maven {
                            name = "sonatype"
                            url = uri(sonatypeRepo)
                            credentials {
                                username = sonatypeUser
                                password = sonatypePassword
                            }
                        }
                    }
                }

            }
        }
    }
}