plugins {
  id 'com.android.application' version '8.1.1'
}

android {
  namespace 'juloo.keyboard2'
  compileSdk 34

  defaultConfig {
    applicationId "juloo.keyboard2"
    minSdk 11
    targetSdkVersion 34
    versionCode 41
    versionName "1.29.0"
  }

  sourceSets {
    main {
      manifest.srcFile 'AndroidManifest.xml'
      java.srcDirs = ['srcs']
      res.srcDirs = ['res', 'build/generated-resources']
      assets.srcDirs = ['assets']
    }
  }

  signingConfigs {
    // Debug builds will always be signed. If no environment variables are set, a default
    // keystore will be initialized by the task initDebugKeystore and used. This keystore
    // can be uploaded to GitHub secrets by following instructions in CONTRIBUTING.md
    // in order to always receive correctly signed debug APKs from the CI.
    debug {
      storeFile(System.env.DEBUG_KEYSTORE ? file(System.env.DEBUG_KEYSTORE) : file("debug.keystore"))
      storePassword(System.env.DEBUG_KEYSTORE_PASSWORD ? "$System.env.DEBUG_KEYSTORE_PASSWORD" : "debug0")
      keyAlias(System.env.DEBUG_KEY_ALIAS ? "$System.env.DEBUG_KEY_ALIAS" : "debug")
      keyPassword(System.env.DEBUG_KEY_PASSWORD ? "$System.env.DEBUG_KEY_PASSWORD" : "debug0")
    }

    release {
      if (System.env.RELEASE_KEYSTORE) {
        storeFile file(System.env.RELEASE_KEYSTORE)
        storePassword "$System.env.RELEASE_KEYSTORE_PASSWORD"
        keyAlias "$System.env.RELEASE_KEY_ALIAS"
        keyPassword "$System.env.RELEASE_KEY_PASSWORD"
      }
    }
  }

  buildTypes {
    release {
      minifyEnabled true
      shrinkResources true
      debuggable false
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
      resValue "string", "app_name", "@string/app_name_release"
      signingConfig signingConfigs.release
    }

    debug {
      minifyEnabled false
      shrinkResources false
      debuggable true
      applicationIdSuffix ".debug"
      resValue "string", "app_name", "@string/app_name_debug"
      resValue "bool", "debug_logs", "true"
      signingConfig signingConfigs.debug
    }
  }

  // Name outputs after the application ID.
  android.applicationVariants.all { variant ->
    variant.outputs.all {
      outputFileName = "${applicationId}.apk"
    }
  }

  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }

  lintOptions {
    // Translation are already checked by 'syncTranslations'
    disable 'MissingTranslation'
  }
}

dependencies {
}

tasks.register('buildKeyboardFont') {
  println "\nBuilding assets/special_font.ttf"
  mkdir "$buildDir"
  exec {
    workingDir "$projectDir/srcs/special_font"
    def svgFiles = workingDir.listFiles().findAll {
      it.isFile() && it.name.endsWith(".svg")
    }
    commandLine("fontforge", "-lang=ff", "-script", "build.pe", "$buildDir/special_font.ttf", *svgFiles)
  }
  copy {
    from "$buildDir/special_font.ttf"
    into "assets"
  }
}

tasks.register('genEmojis') {
  println "\nGenerating res/raw/emojis.txt"
  exec {
    workingDir = projectDir
    commandLine "python", "gen_emoji.py"
  }
}

tasks.withType(Test).configureEach {
  dependsOn 'genLayoutsList'
  dependsOn 'checkKeyboardLayouts'
  dependsOn 'syncTranslations'
  dependsOn 'compileComposeSequences'
}

tasks.register('genLayoutsList') {
  println "\nGenerating res/values/layouts.xml"
  exec {
    workingDir = projectDir
    commandLine "python", "gen_layouts.py"
  }
}

tasks.register('checkKeyboardLayouts') {
  println "\nChecking layouts"
  exec {
    def layouts = new File(projectDir, "srcs/layouts").listFiles().findAll {
      it.name.endsWith(".xml")
    }
    workingDir = projectDir
    commandLine("python", "check_layout.py", *layouts)
    standardOutput = new FileOutputStream("${projectDir}/check_layout.output")
  }
}

tasks.register('syncTranslations') {
  println "\nUpdating translations"
  exec {
    workingDir = projectDir
    commandLine "python", "sync_translations.py"
  }
}

tasks.register('compileComposeSequences') {
  def out = "srcs/juloo.keyboard2/ComposeKeyData.java"
  println "\nGenerating ${out}"
  exec {
    def sequences = new File(projectDir, "srcs/compose").listFiles().findAll {
      it.name.endsWith(".pre") || it.name.endsWith(".json")
    }
    workingDir = projectDir
    commandLine("python", "srcs/compose/compile.py", *sequences)
    standardOutput = new FileOutputStream("${projectDir}/${out}")
  }
}

tasks.named("preBuild") {
  dependsOn += "initDebugKeystore"
  dependsOn += "copyRawQwertyUS"
  dependsOn += "copyLayoutDefinitions"
}

tasks.register('initDebugKeystore') {
  if (!file("debug.keystore").exists()) {
    println "Initializing default debug keystore"
    exec {
      // A shell script might be needed if this line requires input from the user
      commandLine "keytool", "-genkeypair", "-dname", "cn=d, ou=e, o=b, c=ug", "-alias", "debug", "-keypass", "debug0", "-keystore", "debug.keystore", "-keyalg", "rsa", "-storepass", "debug0", "-validity", "10000"
    }
  }
}

// latn_qwerty_us is used as a raw resource by the custom layout option.
tasks.register('copyRawQwertyUS')
{
  copy {
    from "srcs/layouts/latn_qwerty_us.xml"
    into "build/generated-resources/raw"
  }
}

tasks.register('copyLayoutDefinitions')
{
  copy {
    from "srcs/layouts"
    include "*.xml"
    into "build/generated-resources/xml"
  }
}
