$stdout.sync = true

Repository.where('last_build_finished_at is not null').count(group: :github_language)

rates = Repository.where('last_build_finished_at is not null').count(group: [:last_build_state, :github_language])
groups = rates.group_by { |k, v| k[1] }
stats = groups.map do |lang, values|
  values.inject({ "language" => lang || 'unknown' }) do |result, (state, count)|
    result.merge(state[0] => count)
  end
end

keys = %w(language total passed failed errored cancelled)
puts keys.join(',')

rows = stats.map do |stat|
  values = stat.values
  row = [values.shift]
  row << stat.values[1..-1].inject(&:+)
  keys[1..-1].each { |key| row << (stat[key] || 0) }
  row
end

rows = rows.sort_by { |row| row[1] }.reverse
csv = rows.map { |row| row.join(',') }
puts csv.join("\n")