default_platform(:android)

platform :android do
  desc "Run tests"
  lane :tests do |options|
    skip_docs
    gradle(tasks: ["clean", "testDevelopmentPlaystoreDebugUnitTest"])
    gradle(tasks: ["connectedInstrumentationPlaystoreDebugAndroidTest", "--info"])
  end

  desc "Run linter"
  lane :lint do |options|
    skip_docs
    lint_result = gradle(tasks: ["clean", "lintDevelopmentPlaystoreDebug", "lintDevelopmentFdroidDebug", "lintKotlinMain", "checkLicenses"])


    if options[:strict] && (lint_result.include? "report") then
      UI.user_error!("The linter reported one or more issues.")
    end
  end

  desc "Prepare pull request"
  lane :pr do
    skip_docs
    ensure_git_status_clean
    sh("git", "push", "--dry-run")
    lint(strict: true)
    rocket
    sh("BRANCH=`git rev-parse --abbrev-ref HEAD | sed -e \"s~/~%2F~g\"` && open \"https://github.com/TICESoftware/tice-android/compare/develop...${BRANCH}\"")
    sh("open \"https://tenor.com\"")
  end

  desc "Submit build for internal testing to Google Play Store"
  lane :testingPlaystore do |options|
    skip_docs

    buildPlaystoreAndSubmit(
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true,
      increment_version_code: options[:increment_version_code],
      version_name: options[:version_name],
      stage: "adhoc",
      track: "internal",
      package_name: "app.tice.TICE.testing"
    )
  end

  lane :testingFdroid do
    skip_docs

    buildFdroid(
      increment_version_code: options[:increment_version_code],
      version_name: options[:version_name],
      stage: "adhoc",
      package_name: "app.tice.TICE.testing"
    )
  end

  desc "Submit build for public beta testing"
  lane :previewPlaystore do |options|
    skip_docs

    buildAndSubmit(
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true,
      increment_version_code: options[:increment_version_code],
      version_name: options[:version_name],
      stage: "preview",
      track: "alpha",
      package_name: "app.tice.TICE.preview"
    )
  end

  lane :previewFdroid do
    skip_docs

    buildFdroid(
      increment_version_code: options[:increment_version_code],
      version_name: options[:version_name],
      stage: "preview",
      package_name: "app.tice.TICE.preview"
    )
  end

  desc "Submit build for production to release track immediately"
  lane :releaseProduction do |options|
    skip_docs

    buildAndSubmit(
      skip_upload_metadata: false,
      skip_upload_images: options[:skip_uploading_screenshots],
      skip_upload_screenshots: options[:skip_uploading_screenshots],
      increment_version_code: options[:increment_version_code],
      version_name: options[:version_name],
      stage: "production",
      track: "production",
      package_name: "app.tice.TICE.production"
    )
  end

  desc "Submit build for production to internal test lane"
  lane :releaseInternal do |options|
    skip_docs

    buildAndSubmit(
      skip_upload_metadata: false,
      skip_upload_images: options[:skip_uploading_screenshots],
      skip_upload_screenshots: options[:skip_uploading_screenshots],
      increment_version_code: options[:increment_version_code],
      version_name: options[:version_name],
      stage: "production",
      track: "internal",
      package_name: "app.tice.TICE.production"
    )
  end

  lane :productionFdroid do
    skip_docs

    buildFdroid(
      increment_version_code: options[:increment_version_code],
      version_name: options[:version_name],
      stage: "production",
      package_name: "app.tice.TICE.production"
    )
  end

  desc "Create new Playstore build and submit to Google Play Store"
  lane :buildPlaystoreAndSubmit do |options|
    skip_docs
    ensure_git_status_clean

    updateVersion(
      increment_version_code: options[:increment_version_code],
      version_name: options[:version_name]
    )

    tagBuild(
      stage: options[:stage],
      store: "Playstore"
    )

    gradle(
      task: 'bundle',
      flavor: options[:stage].downcase + 'Playstore',
      build_type: 'release',
      properties: {
        "android.injected.signing.store.file" => ENV["KEYSTORE_PATH"],
        "android.injected.signing.store.password" => ENV["KEYSTORE_PASSWORD"],
        "android.injected.signing.key.alias" => "upload",
        "android.injected.signing.key.password" => ENV["UPLOAD_KEY_PASSWORD"]
      }
    )

    supply(
      track: options[:track],
      package_name: options[:package_name],
      json_key: ENV["JSON_KEY_PATH"],
      skip_upload_metadata: options[:skip_upload_metadata],
      skip_upload_images: options[:skip_upload_images],
      skip_upload_screenshots: options[:skip_upload_screenshots],
      skip_upload_apk: true
    )
  end

  desc "Create new F-droid build and provide it via Slack"
  lane :buildFdroid do |options|
    updateVersion(
      increment_version_code: options[:increment_version_code],
      version_name: options[:version_name]
    )

    tagBuild(
      stage: options[:stage],
      store: "Fdroid"
    )

    apk_file_path = sh("../Scripts/buildFdroidVersion.sh", options[:package], options[:stage]).split().last

    puts 'Copying apk file to publicly accessible directory.'

    public_dir = "/usr/local/var/www/#{options[:stage]}"
    base_url = "https://ci.tice.software/#{options[:stage]}/"
    apk_file_name = apk_file_path.split('/').last

    copy_artifacts(artifacts: [apk_file_path], target_path: public_dir)
    public_url = "#{base_url}/#{apk_file_name}"

    slack(
        message: "A new Android #{options[:stage]} (F-droid) build is ready to download.",
        slack_url: ENV['SLACK_WEBHOOK_URL'],
        attachment_properties: {
          actions: [
            {
              type: 'button',
              name: 'download_button',
              text: 'Download on Android',
              url: public_url,
              style: 'primary'
            }
          ]
        }
      )
  end

  desc "Add tag recognized by F-droid update bot"
  lane :releaseFdroid do
    tagBuild(
      stage: "release",
      store: "Fdroid"
    )
  end

  desc "Add a tag for the passed stage and store using the current version name and code"
  lane :tagBuild do |options|
    version_name = android_get_version_name
    version_code = android_get_version_code

    add_git_tag(tag: "#{version_name}-#{version_code}-#{options[:stage].downcase}#{options[:store].capitalize}")
    push_to_git_remote
  end

  desc "Update version name and bump version code"
  lane :updateVersion do |options|
    skip_docs
    ensure_git_status_clean

    version_updated = false

    if options[:increment_version_code]
      increment_version_code(gradle_file_path: "app/build.gradle")
      version_updated = true
    end

    if options[:version_name]
      android_set_version_name(version_name: options[:version_name])
      version_updated = true
    end

    version_name = android_get_version_name
    version_code = android_get_version_code

    if version_updated
      git_commit(path: "app/build.gradle", message: "Bump version to #{version_name}-#{version_code}")
      push_to_git_remote
    end
  end

  desc "Update translations"
  lane :translations do |options|
    skip_docs
    sh 'cd .. && poeditor pull --config poeditor.yml'

    commit = options[:commit]
    if commit
      git_add(path: "app/src/main/res/values*/strings.xml")
      git_commit(path: [], message: "Update translations") unless git_status(path: "TICE/Resources/").empty?
    end
  end
end
