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

apply plugin: "de.undercouch.download"

configure(rootProject) {
  ext {
    momanDir = file("${buildDir}/moman")
  }

  task moman()  {
    description "Regenerate Moman-based sources for ...lucene/util/automaton and ...lucene/util/packed."
    group "generation"

    dependsOn ":lucene:core:utilGenPacked"
    dependsOn ":lucene:core:utilGenLev"
  }

  task installMoman(type: Download) {
    def momanZip = file("${momanDir}/moman.zip")

    src "https://github.com/jpbarrette/moman/archive/497c90e34e412b6494db6dabf0d95db8034bd325.zip"
    dest momanZip
    onlyIfModified true

    doLast {
      ant.unzip(src: momanZip, dest: momanDir, overwrite: "true") {
        ant.cutdirsmapper(dirs: "1")
      }
    }
  }
}

configure(project(":lucene:core")) {
  task utilGenPacked(dependsOn: rootProject.installMoman) {
    description "Regenerate util/PackedBulkOperationsPacked*.java and Packed64SingleBlock.java"
    group "generation"

    doLast {
      def targetDir = file("src/java/org/apache/lucene/util/packed")

      ['gen_BulkOperation.py', 'gen_Packed64SingleBlock.py'].each { prog ->
        logger.lifecycle("Executing: ${prog} in ${targetDir}")
        project.exec {
          workingDir targetDir
          executable project.externalTool("python3")
          args = ['-B', "${prog}"]
        }
      }
      // Correct line endings for Windows.
      project.ant.fixcrlf(
          srcDir: targetDir,
          includes: 'Packed64SingleBlock.java, BulkOperation*.java',
          encoding: 'UTF-8',
          eol: 'lf'
      )
    }
  }

  task utilGenLev(dependsOn: rootProject.installMoman) {
    description "Regenerate util/automaton Lev*ParametricDescription.java"
    group "generation"

    doLast {
      def targetDir = file("src/java/org/apache/lucene/util/automaton")

      ['1', '2'].each { num ->
        ['True', 'False'].each { transpose ->
          project.exec {
            workingDir targetDir
            executable project.externalTool("python3")
            args = ['-B', 'createLevAutomata.py', num, transpose, "${momanDir}/finenight/python"]
          }
        }
      }
      project.ant.fixcrlf(
          srcDir: targetDir,
          includes: '*ParametricDescription.java',
          encoding: 'UTF-8',
          eol: 'lf'
      )
    }
  }

  task regenerate() {
    description "Regenerate any generated sources"
    group "generation"

    // Run regeneration tasks.
    dependsOn utilGenPacked
    dependsOn utilGenLev

    // Clean up and reformat the generated sources after generation.
    dependsOn "tidy"
  }

  // Make sure tidy runs after generation, if they're defined.
  tasks.matching { it.name == "tidy" }.configureEach {
    mustRunAfter utilGenPacked, utilGenLev
  }
}
