/*
 * 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 de.undercouch.gradle.tasks.download.Download
import org.apache.lucene.gradle.plugins.help.ExecOperationsProvider

// This downloads and compiles Nori dictionaries.

def recompileDictionary(project, dictionaryName, Closure closure) {
  def execOps = objects.newInstance(ExecOperationsProvider).execOperations
  execOps.javaexec {
    mainClass = "org.apache.lucene.analysis.ko.dict.DictionaryBuilder"
    classpath = project.sourceSets.main.runtimeClasspath

    jvmArgs '-Xmx1G'

    with closure
  }
  project.logger.lifecycle("Automaton regenerated from dictionary: ${dictionaryName}")
}

configure(project(":lucene:analysis:nori")) {
  plugins.withType(JavaPlugin).configureEach {
    project.ext {
      targetDir = project.file("src/resources")
    }

    task deleteDictionaryData() {
      // There should really be just one but since we don't know which
      // one it'll be, let's process all of them.
      doFirst {
        sourceSets.main.resources.srcDirs.each { location ->
          delete fileTree(dir: location, include: "org/apache/lucene/analysis/ko/dict/*.dat")
        }
      }
    }

    task compileMecabKo(type: Download) {
      description = "Recompile dictionaries from Mecab-Ko data."
      group = "generation"

      dependsOn deleteDictionaryData
      dependsOn sourceSets.main.runtimeClasspath

      def dictionaryName = "mecab-ko-dic-2.1.1-20180720"
      def dictionarySource = "https://s3.amazonaws.com/lucene-testdata/mecab/${dictionaryName}.tar.gz"
      def dictionaryFile = file("${buildDir}/generate/${dictionaryName}.tar.gz")
      def unpackedDir = file("${buildDir}/generate/${dictionaryName}")

      src dictionarySource
      dest dictionaryFile
      onlyIfModified true

      doLast {
        // Unpack the downloaded archive.
        delete unpackedDir
        ant.untar(src: dictionaryFile, dest: unpackedDir, compression: "gzip") {
          ant.cutdirsmapper(dirs: "1")
        }

        // Compile the dictionary
        recompileDictionary(project, dictionaryName, {
          args += [
            unpackedDir,
            targetDir,
            "utf-8",
            false
          ]
        })
      }
    }

    regenerate.dependsOn compileMecabKo
  }
}
