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"
  lane :testing do |options|
    skip_docs

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

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

    buildAndSubmit(
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true,
      skip_increment_version_code: options[:skip_increment_version_code],
      version_name: options[:version_name],
      stage: "preview",
      track: "alpha",
      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],
      skip_increment_version_code: options[:skip_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],
      skip_increment_version_code: options[:skip_increment_version_code],
      version_name: options[:version_name],
      stage: "production",
      track: "internal",
      package_name: "app.tice.TICE.production"
    )
  end

  desc "Submit new build to Google Play Store"
  lane :buildAndSubmit do |options|
    skip_docs
    ensure_git_status_clean

    if !options[:skip_increment_version_code]
      increment_version_code(gradle_file_path: "app/build.gradle")
    end

    if options[:version_name]
      android_set_version_name(version_name: options[:version_name])
    end

    version_name = android_get_version_name
    version_code = android_get_version_code

    puts 'Build F-droid version.'

    gradle(
      task: 'assemble',
      flavor: options[:stage].capitalize + 'Fdroid',
      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"]
      }
    )

    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_path = lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]
    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}"

    puts 'Build Play Store version.'

    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"]
      }
    )

    if !options[:skip_increment_version_code] || options[:version_name]
      git_commit(path: "app/build.gradle", message: "Bump version code to #{version_code}")
      add_git_tag(tag: "#{version_name}-#{version_code}-#{options[:stage]}")
      push_to_git_remote
    end

    puts 'Publish F-droid version.'
    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'
            }
          ]
        }
      )

    puts 'Publish Play Store version.'
    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 "Bump version code"
  lane :bumpVersionCode do
    skip_docs
    ensure_git_status_clean

    increment_version_code(gradle_file_path: "app/build.gradle")

    version_name = android_get_version_name
    version_code = android_get_version_code

    git_commit(path: "app/build.gradle", message: "Bump version code to #{version_code}")
    add_git_tag(tag: "#{version_name}-#{version_code}")
  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
