default_platform(:ios)

platform :ios do
  desc "Build a release tag and upload it to TestFlight"
  lane :beta do
    setup_ci

    match(type: "appstore")

    tag = ENV.fetch("GITHUB_REF_NAME")
    version = tag[%r{\Arelease/v(\d+\.\d+\.\d+)\z}, 1]
    UI.user_error!("Expected a tag in the form release/vX.X.X; got #{tag.inspect}") unless version

    build_number = ENV.fetch("GITHUB_RUN_NUMBER")
    UI.user_error!("GITHUB_RUN_NUMBER must be a positive integer") unless build_number.match?(/\A[1-9]\d*\z/)

    home_assistant_access_token = ENV["HOME_ASSISTANT_ACCESS_TOKEN"]&.strip
    if home_assistant_access_token.to_s.empty?
      UI.user_error!("HOME_ASSISTANT_ACCESS_TOKEN must be configured for release builds")
    end

    update_info_plist(
      plist_path: "XIONControlPanel/SupportingFiles/Info.plist",
      block: proc do |plist|
        plist["CFBundleShortVersionString"] = version
        plist["CFBundleVersion"] = build_number
        plist["HomeAssistantAccessToken"] = home_assistant_access_token
      end
    )

    api_key = app_store_connect_api_key(
      key_id: ENV.fetch("ASC_KEY_ID"),
      issuer_id: ENV.fetch("ASC_ISSUER_ID"),
      key_content: ENV.fetch("ASC_KEY"),
      is_key_content_base64: true
    )

    build_app(scheme: "XIONControlPanel")

    archived_plist = File.join(
      lane_context[SharedValues::XCODEBUILD_ARCHIVE],
      "Products",
      "Applications",
      "XION.app",
      "Info.plist"
    )
    archived_access_token = get_info_plist_value(
      path: archived_plist,
      key: "HomeAssistantAccessToken"
    ).to_s
    unless archived_access_token == home_assistant_access_token
      UI.user_error!("The archived app does not contain the configured Home Assistant access token")
    end

    upload_to_testflight(
      api_key: api_key,
      skip_waiting_for_build_processing: true,
      uses_non_exempt_encryption: false
    )
  end
end
