def assetsDirectory = brltty.getAssetsPath(project)
def messagesDirectory = assetsDirectory + File.separator + "locale"
def tablesDirectory = assetsDirectory + File.separator + "tables"

task brlttyAddTables (type: Copy) {
  group "build"
  description "Add the tables (text, contraction, attributes, keyboard, input) to the build (as assets)."

  from brltty.native.tablesDirectory
  into tablesDirectory
  include 'Text/**/*.tt?'
  include 'Contraction/**/*.ct?'
  include 'Attributes/**/*.at?'
  include 'Keyboard/**/*.kt?'
  include 'Input/**/*.kt?'
}

task brlttyRemoveTables (type: Delete) {
  group "build"
  description "Remove the tables (text, contraction, attributes, keyboard, input) from the build."

  delete tablesDirectory
}

tasks.register("brlttyAddMessages") {
  group "build"
  description "Add the message catalogs (.mo files) to the build (as assets)."

  doLast {
    def commandProcesses = []

    try {
      def sourceDirectory = new File(brltty.native.messagesDirectory)
      def sourceFiles = layout.files {sourceDirectory.listFiles()}

      sourceFiles.each { sourceFile ->
        def sourceName = sourceFile.name

        if (sourceName.endsWith(".po")) {
          def languageCode = sourceName.replaceAll(/\..+?$/, '')
          def targetDirectory = new File(messagesDirectory + File.separator + languageCode + File.separator + "LC_MESSAGES")

          if (targetDirectory.isDirectory() || targetDirectory.mkdirs()) {
            def targetFile = new File(targetDirectory, "brltty.mo")

            def commandArguments = [
              "msgfmt", "--no-hash",
              "--output-file=" + targetFile.absolutePath,
              "--", sourceFile.absolutePath
            ]

            def commandProcess = commandArguments.execute()
            commandProcess.waitForProcessOutput(new StringBuffer(), System.err)
            commandProcesses += commandProcess
          } else {
            throw new IOException("messages directory not created: " + targetDirectory.absolutePath)
          }
        }
      }
    } finally {
      def ok = true

      commandProcesses.each { process ->
        int exitValue = process.waitFor()
        if (exitValue) ok = false
      }

      if (!ok) throw new RuntimeException("installing messages failed")
    }
  }
}

task brlttyRemoveMessages (type: Delete) {
  group "build"
  description "Remove the message catalogs (.mo files) from the build."

  delete messagesDirectory
}

brltty.addAssembleTask project, brlttyAddMessages
brltty.addAssembleTask project, brlttyAddTables
clean.dependsOn brlttyRemoveMessages
clean.dependsOn brlttyRemoveTables
