/*
 * 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.
 */

// This downloads and compiles Nori dictionaries.

def recompileDictionary(project, dictionaryName, Closure closure) {
  project.javaexec {
    main = "org.apache.lucene.analysis.ko.util.DictionaryBuilder"
    classpath = project.sourceSets.main.runtimeClasspath

    jvmArgs '-Xmx1G'

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

configure(project(":lucene:analysis:nori")) {
  apply plugin: "de.undercouch.download"

  plugins.withType(JavaPlugin) {
    ext {
      targetDir = 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.0.3-20170922"
      def dictionarySource = "https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/${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
          ]
        })
      }
    }
  }
}
