@file:Suppress("SpellCheckingInspection")

import org.jetbrains.intellij.IntelliJPluginExtension
import org.jetbrains.intellij.tasks.BuildPluginTask
import org.jetbrains.intellij.tasks.BuildSearchableOptionsTask
import org.jetbrains.intellij.tasks.PatchPluginXmlTask
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
	idea
	kotlin("jvm")
	id("org.jetbrains.intellij") apply false
}

group = "com.chylex.intellij.rainbowbrackets"
version = "6.26-chylex-3"

val ideVersion = "2023.3"
val ideBuild = "233"

idea {
	module {
		excludeDirs.add(file("gradle"))
	}
}

dependencies {
	implementation(project(":clion"))
	implementation(project(":idea"))
	implementation(project(":rider"))
}

subprojects {
	apply(plugin = "org.jetbrains.kotlin.jvm")
	apply(plugin = "org.jetbrains.intellij")
	
	group = rootProject.group
	version = rootProject.version
	
	repositories {
		mavenCentral()
		maven(url = "https://www.jetbrains.com/intellij-repository/releases")
		maven(url = "https://www.jetbrains.com/intellij-repository/snapshots")
	}
	
	dependencies {
		testImplementation("junit:junit:4.13.2")
		testImplementation("io.kotest:kotest-assertions-core:5.5.5")
	}
	
	kotlin {
		jvmToolchain(17)
	}
	
	configure<IntelliJPluginExtension> {
		version.set(ideVersion)
		updateSinceUntilBuild.set(false)
	}
	
	tasks.withType<KotlinCompile> {
		kotlinOptions.freeCompilerArgs = listOf(
			"-Xjvm-default=all"
		)
	}
	
	tasks.test {
		useJUnit()
	}
	
	tasks.getByName<BuildSearchableOptionsTask>("buildSearchableOptions") {
		enabled = false
	}
	
	tasks.getByName<PatchPluginXmlTask>("patchPluginXml") {
		sinceBuild.set(ideBuild)
	}
	
	tasks.getByName<BuildPluginTask>("buildPlugin") {
		eachFile {
			name = name.replaceFirst("instrumented-", "instrumented-RainbowBrackets-")
			relativePath.segments[0] = "RainbowBrackets"
		}
		
		includeEmptyDirs = false
	}
}

tasks.register<Zip>("buildPlugin") {
	group = "intellij"
	
	for (project in listOf("clion", "idea", "rider")) {
		val buildPlugin = project(":$project").tasks.getByName("buildPlugin")
		val outputs = buildPlugin.outputs.files.map(::zipTree)
		
		dependsOn(buildPlugin)
		
		from(outputs) {
			include("RainbowBrackets/lib/instrumented-RainbowBrackets-$project-$version.jar")
		}
		
		if (project == "idea") {
			from(outputs) {
				include("RainbowBrackets/lib/searchableOptions-$version.jar")
			}
		}
	}
	
	destinationDirectory = layout.buildDirectory.dir("distributions")
}