/*
 * 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.tools.ant.taskdefs.condition.Os
import org.apache.tools.ant.filters.*
import java.nio.file.Files

apply plugin: 'java-library'

description = 'Luke - Lucene Toolbox'

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

configurations {
  standalone
  implementation.extendsFrom standalone
}

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

  implementation 'org.apache.logging.log4j:log4j-core'

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

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

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

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

// Configure the default JAR without any class path information
// (this may actually be wrong - perhaps we should add the
// "distribution" paths here.
jar {
  manifest {
  }
}

// Configure "stand-alone" JAR with proper dependency classpath links.
task standaloneJar(type: Jar) {
  dependsOn classes

  archiveFileName = "${archivesBaseName}-${project.version}-standalone.jar"

  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(' '))
    }
  }
}

task standaloneAssemble(type: Sync) {
  def antHelper = new org.apache.tools.ant.Project()
  afterEvaluate {
    def substituteProperties = [
        "required.java.version": project.java.targetCompatibility,
        "luke.cmd": "${standaloneJar.archiveFileName.get()}"
    ]
    substituteProperties.each { k, v -> antHelper.setProperty(k.toString(), v.toString()) }
  }

  from standaloneJar
  from configurations.runtimeClasspath

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

  into standaloneDistDir

  doLast {
    logger.lifecycle("Standalone Luke distribution assembled. You can run it with:\n"
        + "java -jar " + file("${standaloneDistDir}/${standaloneJar.archiveFileName.get()}"))
  }
}

// Attach standalone distribution assembly to main assembly.
assemble.dependsOn standaloneAssemble

// Create a standalone package bundle.
task standalonePackage(type: Tar) {
  from standaloneAssemble

  into "${archivesBaseName}-${project.version}/"

  compression = Compression.GZIP
  archiveFileName = "${archivesBaseName}-${project.version}-standalone.tgz"
}

// Create a set of artifacts for standalone distribution in a specific
// exported configuration so that it can be pulled in by other projects.
artifacts {
  standalone standaloneDistDir, {
    builtBy standaloneAssemble
  }
}

// Utility to launch Luke (and fork it from the build).
task run() {
  dependsOn standaloneAssemble
  description "Launches (spawns) Luke directly from the build process."
  group "Utility launchers"

  doFirst {
    logger.lifecycle("Launching Luke ${project.version} right now...")
    def javaExecutable = {
      def registry = project.extensions.getByType(JavaInstallationRegistry)
      def currentJvm = registry.installationForCurrentVirtualMachine.get()
      currentJvm.getJavaExecutable().asFile
    }()
    ant.exec(
        executable: javaExecutable,
        spawn: true,
        vmlauncher: true
    ) {
      arg(value: '-jar')
      arg(value: file("${standaloneDistDir}/${standaloneJar.archiveFileName.get()}").absolutePath)
    }
  }
}
