def create_new_release_in_sentry()
  sh([
    'yarn', 'sentry:create:release',
    '--authToken', sentry_auth_token(),
    '--org', sentry_organization_name(),
    '--project', qa_sentry_project_name(),
    '--release', sentry_release_name(),
  ])
  sh([
    'yarn', 'sentry:create:release',
    '--authToken', sentry_auth_token(),
    '--org', sentry_organization_name(),
    '--project', prod_sentry_project_name(),
    '--release', sentry_release_name(),
  ])
end

def upload_js_bundle_and_sourcemap_to_sentry_for_android()
  upload_js_bundle_and_sourcemap_to_sentry(
    ANDROID_BUNDLE_FILE,
    ANDROID_SOURCEMAP_FILE,
    qa_sentry_project_name()
  )
  upload_js_bundle_and_sourcemap_to_sentry(
    ANDROID_BUNDLE_FILE,
    ANDROID_SOURCEMAP_FILE,
    prod_sentry_project_name()
  )
end

def upload_js_bundle_and_sourcemap_to_sentry_for_ios()
  upload_js_bundle_and_sourcemap_to_sentry(
    IOS_BUNDLE_FILE,
    IOS_SOURCEMAP_FILE,
    qa_sentry_project_name()
  )
  upload_js_bundle_and_sourcemap_to_sentry(
    IOS_BUNDLE_FILE,
    IOS_SOURCEMAP_FILE,
    prod_sentry_project_name()
  )
end

def upload_js_bundle_and_sourcemap_to_sentry(bundle_file, sourcemap_file, project)
  sh([
    'yarn', 'sentry:upload:js',
    '--authToken', sentry_auth_token(),
    '--org', sentry_organization_name(),
    '--project', project,
    '--release', sentry_release_name(),
    '--distribution', sentry_release_name(),
    '--jsBundle', bundle_file,
    '--jsSourcemaps', sourcemap_file,
    '--root', root_project_directory_path(),
  ])
end

def sentry_release_name()
  return "#{ENV[ENV_BUNDLE_VERSION_NAME]}"
end

def upload_proguard_mapping_to_sentry()
  Dir.chdir(root_project_directory_path()) do
    qaCommand = [
      'yarn', 'sentry:upload:proguard:mapping',
      '--sentryAuthToken', sentry_auth_token(),
      '--sentryOrg', sentry_organization_name(),
      '--sentryProject', qa_sentry_project_name(),
    ]
    sh(qaCommand)
    prodCommand = [
      'yarn', 'sentry:upload:proguard:mapping',
      '--sentryAuthToken', sentry_auth_token(),
      '--sentryOrg', sentry_organization_name(),
      '--sentryProject', prod_sentry_project_name(),
    ]
    sh(prodCommand)
  end
end

def upload_dsym_mapping_to_sentry()
  sentry_upload_dsym(
    auth_token: sentry_auth_token(),
    org_slug: sentry_organization_name(),
    project_slug: qa_sentry_project_name(),
    dsym_path: "#{root_project_directory_path()}/#{DSYM_MAPPING_FILE}",
    info_plist: "#{root_project_directory_path()}/ios/#{PROJECT_DIRECTORY_NAME}/Info.plist"
  )
  sentry_upload_dsym(
    auth_token: sentry_auth_token(),
    org_slug: sentry_organization_name(),
    project_slug: prod_sentry_project_name(),
    dsym_path: "#{root_project_directory_path()}/#{DSYM_MAPPING_FILE}",
    info_plist: "#{root_project_directory_path()}/ios/#{PROJECT_DIRECTORY_NAME}/Info.plist"
  )
end

def has_uploaded_to_sentry_file(file_url)
  Dir.chdir(root_project_directory_path()) do
    ENV["SENTRY_AUTH_TOKEN"] = sentry_auth_token()
    ENV["SENTRY_ORG"] = sentry_organization_name()
    ENV["SENTRY_PROJECT"] = qa_sentry_project_name()
    sentry_release = sentry_release_name()
    sentry_distribution = sentry_release_name()

    records = sh("npx sentry-cli releases files \"#{sentry_release}\" list")

    record = records.lines.find { |record|
      columns = record.split("|").map { |column| column.strip }
      columns.include?(file_url) && columns.include?(sentry_distribution)
    }

    return record != nil
  end
end
