/*
 * Copyright 2022 Arunkumar
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
buildscript {
  dependencies {
    classpath "dev.arunkumar:scabbard-gradle-plugin:${publishVersion}"
  }
}
plugins {
  id "build-common"
  id "publish-common"
}
apply from: "gradle/local-properties.gradle"

allprojects {
  group groupId
  version publishVersion

  plugins.withType(com.android.build.gradle.BasePlugin).configureEach { plugin ->
    //noinspection GrDeprecatedAPIUsage
    plugin.extension.compileOptions {
      sourceCompatibility = JavaVersion.VERSION_1_8
      targetCompatibility = JavaVersion.VERSION_1_8
    }
  }

  tasks.withType(JavaCompile).configureEach { task ->
    task.sourceCompatibility = JavaVersion.VERSION_1_8
    task.targetCompatibility = JavaVersion.VERSION_1_8
  }

  pluginManager.withPlugin("kotlin-kapt") {
    kapt {
      arguments {
        // TODO(arun) Ensure scabbard does not rely on @Component subclassing and remove this.
        // arg("dagger.generatedClassExtendsComponent", "ENABLED")
      }
    }
  }
}

def isWin = System.getProperty("os.name").toLowerCase().contains("win")
def samplePath = "samples:android-kotlin"
def sampleProject = project(samplePath)

//TODO Investigate migrating to GradleBuild. ATM has issues disabling daemon.
tasks.register("runScabbardProcessor" /*, GradleBuild*/) {
  group = "development"
  doLast {
    def isDebug = project.hasProperty("debug")
    if (isDebug) {
      delete fileTree(sampleProject.buildDir).matching {
        include "**/*.dot"
        include "**/*.png"
        include "**/*.svg"
      }
    }
    exec {
      def shell = isWin ? "cmd" : "sh"
      def commandPrefix = isWin ? "" : "./"
      def shellArg = isWin ? "/c" : "-c"

      def gradleDebug = "-Dorg.gradle.debug=$isDebug"
      def daemon = isDebug ? "--no-daemon" : ""
      def command = "${commandPrefix}gradlew $daemon $gradleDebug --no-build-cache ${samplePath}:kaptDebugKotlin"
      workingDir(projectDir)
      commandLine shell, shellArg, command
    }
  }
}

tasks.register("serveDocs") {
  group = "documentation"
  description = "Serve documentation website and open browser"
  doLast {
    def url = "http://127.0.0.1:8000/"
    if (isWin) {
      exec { commandLine "cmd", "/c", "start $url" }
    } else {
      exec { commandLine "open", url }
    }
    exec { commandLine("mkdocs", "serve") }
  }
}

tasks.register("publishSampleImages") {
  group = "documentation"
  description = "Publishes sample images to website"
  doLast {
    copy {
      from "${sampleProject.buildDir}/tmp/kapt3/classes/debug/scabbard"
      include "*.svg"
      exclude "full_*.svg"
      into "docs/images"
    }
  }
  dependsOn sampleProject.tasks.named("kaptDebugKotlin")
}

// Common publish task to publish all artifacts
tasks.register("publishAllArtifacts") {
  group = "publishing"
  description = "Publishes all artifiacts"
  // Docs
  dependsOn tasks.named("publishSampleImages")
  // Idea
  dependsOn project("scabbard-idea-plugin").tasks.named("publishPlugin")
  // Gradle plugin
  dependsOn gradle.includedBuild("scabbard-gradle-plugin").task(":publishPlugins")

  // Scabbard and dot-dsl
  def publishTask = "publishReleasePublicationToSonatypeRepository"
  dependsOn project("dot-dsl").tasks.named(publishTask)
  dependsOn project("scabbard-processor").tasks.named(publishTask)
}
