default_platform(:android)

platform :android do
  GRADLE_FILE = "app/build.gradle"

  desc "Run unit tests and linting"
  lane :test do
    gradle(task: "test")
    gradle(task: "lint")
  end

  desc "Increment version code"
  lane :increment_version_code do
    android_set_version_code(gradle_file: GRADLE_FILE)
  end

  desc "Set a specific version name (e.g., fastlane bump_version name:\"1.5.0\")"
  lane :bump_version do |options|
    android_set_version_name(
      version_name: options[:name],
      gradle_file: GRADLE_FILE
    )
  end

  desc "Build release apk"
  lane :build do
    UI.message("***Make sure you have regenerated the data if necessary***")
    gradle(
      task: ":app:assembleGmsRelease",
      project_dir: "./"
    )
  end

  desc "Deploy to internal testing track"
  lane :internal do
    increment_version_code
    build
    v_code = android_get_version_code(gradle_file: GRADLE_FILE)
    v_name = android_get_version_name(gradle_file: GRADLE_FILE)
    # This keeps your legacy APKs active for older devices
    older_versions = [1115, 1202]

    upload_to_play_store(
      track: "internal",
      apk: "app/build/outputs/apk/gms/release/app-gms-release.apk",
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true,
      changes_not_sent_for_review: true,
      version_name: "#{v_name} (#{v_code})",
      version_codes_to_retain: older_versions,
      version_code: v_code
    )
  end

  desc "Promote Internal to Alpha (Closed Testing)"
    lane :promote_to_alpha do
      upload_to_play_store(
        track: 'internal',
        track_promote_to: 'alpha',
        skip_upload_metadata: true,
        skip_upload_images: true,
        skip_upload_screenshots: true,
        skip_upload_changelogs: true
      )
  end

  desc "Promote Alpha to Beta (Open Testing @10%)"
  lane :promote_to_beta do
    upload_to_play_store(
      track: 'alpha',
      track_promote_to: 'beta',
      rollout: '0.1', # Start with a 10% rollout
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true,
      skip_upload_changelogs: true
    )
  end

  desc "Deploy beta to Production @10%"
  lane :deploy do
    # This lane assumes you've already tested the build in Beta
    upload_to_play_store(
      track: 'beta',
      track_promote_to: 'production',
      rollout: '0.1', # Start with a 10% rollout
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true,
      skip_upload_changelogs: true
    )
  end

  desc "Deploy to alpha track"
  lane :alpha do
    increment_version_code
    build
    upload_to_play_store(
      track: "alpha",
      apk: "app/build/outputs/apk/gms/release/app-gms-release.apk",
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true
    )
  end

  desc "Deploy to beta track"
  lane :beta do
    increment_version_code
    build
    upload_to_play_store(
      track: "beta",
      apk: "app/build/outputs/apk/gms/release/app-gms-release.apk",
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true
    )
  end

  desc "Deploy to production"
  lane :production do
    increment_version_code
    build
    upload_to_play_store(
      track: "production",
      apk: "app/build/outputs/apk/gms/release/app-gms-release.apk",
      skip_upload_metadata: true,
      skip_upload_images: true,
      skip_upload_screenshots: true
    )
  end

  desc "Capture screenshots for Play Store. Specify --device_type=sevenInch for a tablet."
  lane :screenshots do
    gradle(
      task: ":app:assembleGmsDebug",
      project_dir: "./"
    )
    gradle(
      task: ":app:assembleGmsDebugAndroidTest",
      project_dir: "./"
    )
    screengrab
  end

  desc "Upload store metadata. Options: whatsnew:true (include changelogs), imgs:true (include screenshots/images), all:true (everything), store:false (skip store metadata)."
  lane :upload_metadata do |options|
      v_code = options[:version_code]
      include_all = options[:all]
      include_whatsnew = include_all || options[:whatsnew]
      include_imgs = include_all || options[:imgs]
      include_store = options[:store] != false
      upload_to_play_store(
        skip_upload_apk: true,
        skip_upload_aab: true,
        skip_upload_metadata: !include_store,
        skip_upload_changelogs: !include_whatsnew,
        skip_upload_images: !include_imgs,
        skip_upload_screenshots: !include_imgs,
        changes_not_sent_for_review: false,
        version_code: v_code,
        track: 'internal'
      )
  end
end
