# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

require "date"

default_platform(:android)

platform :android do
  desc "Runs all the unit tests"
  lane :tests do

    # Run tests
    gradle(task: "clean")
    gradle(task: "koverHtmlReport#{ENV["APP_BUILD_TYPE"]}Debug")

    # Clean Artifacts
    clean_build_artifacts
  end

  desc "Build Wallet and upload it to appcenter"
  lane :deploy do

    git_pull

    appcenter_build_number = latest_appcenter_release(
      appName: ENV["APP_CENTER_APP_NAME"],
      appToken: ENV["APP_CENTER_APP_TOKEN"],
      ownerName: ENV["APP_CENTER_ACCOUNT"],
    )

    buildNumber = build_number(versionNumber: appcenter_build_number)

    set_version(buildCode: buildNumber)
    fullVersion = full_version(buildType: ENV["APP_BUILD_TYPE"])

    tagVersion = tag_name(
      buildName: fullVersion,
      buildNumber: buildNumber,
      brand: ENV["APP_TAG"],
      buildType: ENV["APP_BUILD_TYPE"],
    )

    increment_version_code(
      gradle_file_path: "app/build.gradle.kts",
      version_code: buildNumber,
    )

    gradle(task: "clean")
    gradle(task: "assemble#{ENV["APP_BUILD_TYPE"]}Release")

    upload_to_appcenter(
      appName: ENV["APP_CENTER_APP_NAME"],
      path: ENV["APP_BUILD_TYPE"],
      appToken: ENV["APP_CENTER_APP_TOKEN"],
      ownerName: ENV["APP_CENTER_ACCOUNT"],
      groups: ENV["APP_CENTER_GROUPS"],
    )

    clean_build_artifacts
    reset_versioncode
    reset_versionName

    add_git_tag(
      tag: tagVersion,
    )

    if ENV['PROD_REMOTE_REPO']
      upload_tag(
        remoteUrl: ENV['PROD_REMOTE_REPO'],
        tag: tagVersion,
      )
    end
  
    if ENV['DEV_REMOTE_REPO']
      upload_tag(
        remoteUrl: ENV['DEV_REMOTE_REPO'],
        tag: tagVersion,
      )
    end
  end

  desc "Upload tag to remote repo"
  lane :upload_tag do |values|
    remoteUrl = values[:remoteUrl]
    tag = values[:tag]
    sh("git remote set-url origin #{remoteUrl}")
    push_git_tags(tag: tag)
  end

  desc "Upload to AppCenter"
  lane :upload_to_appcenter do |values|
    appName = values[:appName]
    path = values[:path]
    appToken = values[:appToken]
    ownerName = values[:ownerName]
    groups = values[:groups]
    appcenter_upload(
      api_token: appToken,
      owner_name: ownerName,
      app_name: appName,
      file: "app/build/outputs/apk/#{path}/release/app-#{path}-release.apk",
      notify_testers: true,
      destinations: groups,
    )
  end

  desc "Get Release version From AppCenter"
  lane :latest_appcenter_release do |values|
    appName = values[:appName]
    appVersion = values[:appVersion]
    appToken = values[:appToken]
    ownerName = values[:ownerName]
    version = "1"
    begin
      version = appcenter_fetch_version_number(
        api_token: appToken,
        owner_name: ownerName,
        app_name: appName,
        version: appVersion,
      )["build_number"]
    rescue => ex
    end
    puts "AppCenter Version: #{version}"
    version
  end

  desc "Build Number"
  lane :build_number do |values|
    number = values[:versionNumber].to_i + 1
    puts "Build Number: #{number}"
    number
  end

  desc "Build Tag Name"
  lane :tag_name do |values|
    buildName = values[:buildName]
    buildNumber = values[:buildNumber]
    brand = values[:brand]
    buildType = values[:buildType]
    name = "#{brand}/#{buildType}_Version=#{buildName}_Build=#{buildNumber}"
    puts "Tag Name: #{name}"
    name
  end

  desc "Get version version From Project"
  lane :full_version do |values|
    buildType = values[:buildType]
    versionName = get_properties_value(
      key: "VERSION_NAME",
      path: "version.properties",
    )
    version = "#{versionName}-#{buildType}"
    puts "Full version based on properties value: #{version}"
    version
  end

  desc "Set versionCode back to default 1"
  lane :reset_versioncode do
    increment_version_code(
      gradle_file_path: "app/build.gradle.kts",
      version_code: 1,
    )
  end

  desc "Set versionName back to default yyyy.d.m"
  lane :reset_versionName do
    set_properties_value(
      path: "version.properties",
      key: "VERSION_NAME",
      value: "yyyy.mm.v",
    )
  end

  desc "Build VersionName based on CalVer"
  lane :set_version do |values|
    buildCode = values[:buildCode]
    date = DateTime.now
    version = "#{date.strftime("%Y.%m")}.#{buildCode}"
    puts "Generated Calver: #{version}"
    set_properties_value(
      path: "version.properties",
      key: "VERSION_NAME",
      value: version,
    )
  end
end
