# 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
#
require 'fileutils'

ENV["GYM_PROJECT"] = "iosApp/iosApp.xcodeproj"

lane :release do
    Fastlane::LaneManager.cruise_lane("android", "build_release")
    Fastlane::LaneManager.cruise_lane("ios", "build_release")
    deploy_github

    Fastlane::LaneManager.cruise_lane("android", "deploy_release")
    Fastlane::LaneManager.cruise_lane("ios", "deploy_release")

    Fastlane::LaneManager.cruise_lane("ios", "symbol_upload_release")
end

lane :beta do
    Fastlane::LaneManager.cruise_lane("android", "build_release")
    Fastlane::LaneManager.cruise_lane("ios", "build_release")
    deploy_github_pre_release

    Fastlane::LaneManager.cruise_lane("android", "deploy_beta")
    Fastlane::LaneManager.cruise_lane("ios", "deploy_beta")

    Fastlane::LaneManager.cruise_lane("ios", "symbol_upload_release")
end

platform :android do
    desc "Build signed apk for GitHub release"
    lane :build_release do
        gradle(task: "clean assembleRelease")

        FileUtils.mkdir_p("out/android")
        FileUtils.cp("../composeApp/build/outputs/apk/release/composeApp-release.apk", "out/android/release.apk")
        lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH] = "fastlane/out/android/release.apk"

        gradle(task: "clean bundleRelease")

        FileUtils.cp("../composeApp/build/outputs/bundle/release/composeApp-release.aab", "out/android/release.aab")
        lane_context[SharedValues::GRADLE_AAB_OUTPUT_PATH] = "fastlane/out/android/release.aab"
    end

    desc "Deploy bundleRelease to Google Play"
    lane :deploy_release do
        upload_to_play_store(
            skip_upload_apk: true,
            aab: "fastlane/out/android/release.aab"
        )
    end

    desc "Deploy bundleRelease to Google Play beta track"
    lane :deploy_beta do
        upload_to_play_store(
            skip_upload_apk: true,
            track: 'beta',
            aab: "fastlane/out/android/release.aab"
        )
    end

    desc "Start emulators and take screenshots"
    lane :take_screenshots do
        gradle(task: "clean assembleDebug")
        FileUtils.cp("../composeApp/build/outputs/apk/debug/composeApp-debug.apk", "tmp/debug.apk")

        gradle(task: "clean assembleAndroidTest")
        FileUtils.cp("../composeApp/build/outputs/apk/androidTest/debug/composeApp-debug-androidTest.apk", "tmp/androidTest.apk")

        take_android_screenshots(
            avd: "Screenshots_Pixel_9a",
            device_type: "phone"
        )

        take_android_screenshots(
            avd: "Screenshots_Pixel_9_Pro_Fold",
            device_type: "sevenInch"
        )

        take_android_screenshots(
            avd: "Screenshots_Pixel_Tablet",
            device_type: "tenInch"
        )

        system "rsync -axvP tmp/screenshots/en-US/images/ ../web/public/images/screenshots"
    end
end

platform :ios do
    desc "Build a new release for App Store and GitHub release"
    lane :build_release do
        build_app(
            scheme: "iosApp",
            output_directory: "fastlane/out/ios/"
        )
    end

    desc "Upload debugging symbols"
    lane :symbol_upload_release do
        upload_symbols_to_bugsnag(
            config_file: "iosApp/iosApp/Info.plist",
            dsym_path: "fastlane/out/ios/kitshn.app.dSYM.zip"
        )
    end

    desc "Deploy ipa to App Store"
    lane :deploy_release do
        upload_to_app_store(
            submit_for_review: true,
            automatic_release: true,
            force: true,
            ipa: "fastlane/out/ios/kitshn.ipa"
        )
    end

    desc "Deploy ipa to TestFlight"
    lane :deploy_beta do
        upload_to_testflight(
            ipa: "fastlane/out/ios/kitshn.ipa"
        )
    end
end

desc "Prepare deployment on GitHub"
lane :deploy_github do
    version = retrieve_version()

    FileUtils.mkdir_p("out/gh")
    FileUtils.cp("out/android/release.apk", "out/gh/android-release.apk")
    FileUtils.cp("out/ios/kitshn.ipa", "out/gh/ios-release.ipa")

    set_github_release(
        repository_name: "aimok04/kitshn",
        api_token: ENV["GITHUB_TOKEN"],
        name: "v#{version}",
        tag_name: "v#{version}",
        description: (File.read("metadata/changelog.md") rescue "No changelog provided"),
        commitish: "main",
        upload_assets: ["fastlane/out/gh/android-release.apk", "fastlane/out/gh/ios-release.ipa"],
        is_draft: true
    )
end

desc "Prepare deployment on GitHub (as pre-release)"
lane :deploy_github_pre_release do
    version = retrieve_version()

    FileUtils.mkdir_p("out/gh")
    FileUtils.cp("out/android/release.apk", "out/gh/android-release.apk")
    FileUtils.cp("out/ios/kitshn.ipa", "out/gh/ios-release.ipa")

    set_github_release(
        repository_name: "aimok04/kitshn",
        api_token: ENV["GITHUB_TOKEN"],
        name: "v#{version}",
        tag_name: "v#{version}",
        description: (File.read("metadata/changelog.md") rescue "No changelog provided"),
        commitish: "main",
        upload_assets: ["fastlane/out/gh/android-release.apk", "fastlane/out/gh/ios-release.ipa"],
        is_draft: true,
        is_prerelease: true
    )
end

desc "Prepare new release"
lane :prepare_release do |options|
    change_version(
        version_name: options[:version_name],
        version_code: options[:version_code],
        alternate_version_name: options[:alternate_version_name]
    )

    update_changelog()

    update_release_notes(
        version_code: options[:version_code]
    )
end

desc "Commit new release"
lane :commit_release do
   check_and_commit_release()
end
