/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

import org.apache.lucene.gradle.plugins.java.AlternativeJdkSupportPlugin
import org.apache.tools.ant.filters.*

description = 'Luke - Lucene Toolbox'

ext {
  standaloneDistDir = file("$buildDir/${project.base.archivesName.get()}-${project.version}")
}

dependencies {
  moduleApi project(':lucene:core')

  moduleImplementation project(':lucene:codecs')
  moduleImplementation project(':lucene:backward-codecs')
  moduleImplementation project(':lucene:analysis:common')
  moduleImplementation project(':lucene:queries')
  moduleImplementation project(':lucene:queryparser')
  moduleImplementation project(':lucene:misc')

  moduleImplementation project(":lucene:highlighter")
  moduleImplementation project(':lucene:analysis:icu')
  moduleImplementation project(':lucene:analysis:kuromoji')
  moduleImplementation project(':lucene:analysis:morfologik')
  moduleImplementation project(':lucene:analysis:nori')
  moduleImplementation project(':lucene:analysis:opennlp')
  moduleImplementation project(':lucene:analysis:phonetic')
  moduleImplementation project(':lucene:analysis:smartcn')
  moduleImplementation project(':lucene:analysis:stempel')
  moduleImplementation project(':lucene:suggest')

  moduleTestImplementation project(':lucene:test-framework')
}

// Configure main class name for all JARs.
tasks.withType(Jar).configureEach {
  manifest {
    attributes("Main-Class": "org.apache.lucene.luke.app.desktop.LukeMain")
  }
}

// Configure the main class and version attribute for the module system.
tasks.named("compileJava").configure {
  options.javaModuleMainClass.set("org.apache.lucene.luke.app.desktop.LukeMain")
}

// Process UTF8 property files to unicode escapes.
tasks.withType(ProcessResources).configureEach { task ->
  task.filesMatching("**/messages*.properties", {
    filteringCharset = 'UTF-8'
    filter(EscapeUnicode)
  })
}

// Configure "stand-alone" JAR with proper dependency classpath links.
String standaloneJarName = "${project.base.archivesName.get()}-${project.version}-standalone.jar"

tasks.register("standaloneJar", Jar, {
  dependsOn classes

  archiveFileName = standaloneJarName

  from(sourceSets.main.output)

  // manifest attributes are resolved eagerly and we can't access runtimeClasspath
  // at configuration time so push it until execution.
  doFirst {
    manifest {
      attributes("Class-Path": configurations.runtimeClasspath.collect {
        "${it.getName()}"
      }.join(' '))
    }
  }
})

def standaloneAssembleTask = tasks.register("standaloneAssemble", Sync, {
  def antHelper = new org.apache.tools.ant.Project()
  antHelper.setProperty("required.java.version", libs.versions.minJava.get())
  antHelper.setProperty("luke.cmd", standaloneJarName)

  from standaloneJar
  from configurations.runtimeClasspath

  from(file("src/distribution"), {
    filesMatching("README.md", {
      filteringCharset = 'UTF-8'
      filter(ExpandProperties, project: antHelper)
    })
  })

  into standaloneDistDir

  doLast {

    logger.lifecycle(
        """
Standalone Luke distribution assembled. You can run it with:
java -jar "${standaloneDistDir}/${standaloneJarName}"
java --module-path "${standaloneDistDir}" -m org.apache.lucene.luke
        """
        )
  }
})

// Attach standalone distribution assembly to main assembly.
tasks.named("assemble").configure {
  dependsOn standaloneAssembleTask
}

// Create a standalone package bundle.
tasks.register("standalonePackage", Tar, {
  from standaloneAssembleTask

  into "${project.base.archivesName.get()}-${project.version}/"

  compression = Compression.GZIP
  archiveFileName = "${project.base.archivesName.get()}-${project.version}-standalone.tgz"
})

// Utility to launch Luke (and fork it from the build).
tasks.register("run", {
  description = "Launches (spawns) Luke directly from the build process."
  group = "Utility launchers"

  dependsOn standaloneAssembleTask

  doFirst {
    logger.lifecycle("Launching Luke ${project.version} right now...")
    ant.exec(
        executable: rootProject.getExtensions().getByType(AlternativeJdkSupportPlugin.AltJvmExtension).compilationJvm.get().javaExecutable.toString(),
        spawn: true,
        vmlauncher: true
        ) {
          arg(value: '-jar')
          arg(value: file("${standaloneDistDir}/${standaloneJar.archiveFileName.get()}").absolutePath)
        }
  }
})
