class Buildkite::TestCollector::CI

def self.env

def self.env
  new.env
end

def analytics_env

def analytics_env
  {
    "key" => ENV["BUILDKITE_ANALYTICS_KEY"],
    "url" => ENV["BUILDKITE_ANALYTICS_URL"],
    "branch" => ENV["BUILDKITE_ANALYTICS_BRANCH"],
    "commit_sha" => ENV["BUILDKITE_ANALYTICS_SHA"],
    "number" => ENV["BUILDKITE_ANALYTICS_NUMBER"],
    "job_id" => ENV["BUILDKITE_ANALYTICS_JOB_ID"],
    "message" => ENV["BUILDKITE_ANALYTICS_MESSAGE"],
    "execution_name_prefix" => ENV["BUILDKITE_ANALYTICS_EXECUTION_NAME_PREFIX"],
    "execution_name_suffix" => ENV["BUILDKITE_ANALYTICS_EXECUTION_NAME_SUFFIX"],
    "language_version" => RUBY_VERSION,
    "version" => Buildkite::TestCollector::VERSION,
    "collector" => "ruby-#{Buildkite::TestCollector::NAME}",
    "trace_min_duration" => Buildkite::TestCollector.trace_min_duration&.to_s,
  }.select { |_, value| !value.nil? }
end

def buildkite

def buildkite
  {
    "CI" => "buildkite",
    "key" => ENV["BUILDKITE_BUILD_ID"],
    "url" => ENV["BUILDKITE_BUILD_URL"],
    "branch" => ENV["BUILDKITE_BRANCH"],
    "commit_sha" => ENV["BUILDKITE_COMMIT"],
    "number" => ENV["BUILDKITE_BUILD_NUMBER"],
    "job_id" => ENV["BUILDKITE_JOB_ID"],
    "message" => ENV["BUILDKITE_MESSAGE"],
  }
end

def ci_env

def ci_env
  return buildkite if ENV["BUILDKITE_BUILD_ID"]
  return github_actions if ENV["GITHUB_RUN_NUMBER"]
  return circleci if ENV["CIRCLE_BUILD_NUM"]
  return codeship if ENV["CI_NAME"] == "codeship"
  return generic if ENV["CI"]
  {
    "CI" => nil,
    "key" => Buildkite::TestCollector::UUID.call,
  }
end

def circleci

def circleci
  {
    "CI" => "circleci",
    "key" => "#{ENV["CIRCLE_WORKFLOW_ID"]}-#{ENV["CIRCLE_BUILD_NUM"]}",
    "url" => ENV["CIRCLE_BUILD_URL"],
    "branch" => ENV["CIRCLE_BRANCH"],
    "commit_sha" => ENV["CIRCLE_SHA1"],
    "number" => ENV["CIRCLE_BUILD_NUM"],
  }
end

def codeship

def codeship
  {
    "CI" => "codeship",
    "key" => "#{ENV["CI_BUILD_ID"]}",
    "url" => ENV["CI_PULL_REQUEST"],
    "branch" => ENV["CI_BRANCH"],
    "commit_sha" => ENV["CI_COMMIT_ID"],
    "number" => nil,
    "message" => ENV["CI_COMMIT_MESSAGE"],
  }
end

def env

If they've been specified we'll assume the user wants to use that value instead.
The analytics env are more specific than the automatic ci platform env.
def env
  ci_env.merge(analytics_env).merge(Buildkite::TestCollector.env)
end

def generic

def generic
  {
    "CI" => "generic",
    "key" => Buildkite::TestCollector::UUID.call,
  }
end

def github_actions

def github_actions
  {
    "CI" => "github_actions",
    "key" => "#{ENV["GITHUB_ACTION"]}-#{ENV["GITHUB_RUN_NUMBER"]}-#{ENV["GITHUB_RUN_ATTEMPT"]}",
    "url" => File.join("https://github.com", ENV["GITHUB_REPOSITORY"], "actions/runs", ENV["GITHUB_RUN_ID"]),
    "branch" => ENV["GITHUB_REF_NAME"],
    "commit_sha" => ENV["GITHUB_SHA"],
    "number" => ENV["GITHUB_RUN_NUMBER"],
  }
end