app/helpers/sweeps_helper.rb
# Helper methods related to sweeps.
module SweepsHelper
  PROGRESS_BAR_STYLE_MAPPINGS = {
    'under_review' => 'progress-bar-warning',
    'accepted'     => 'progress-bar-success',
    'rejected'     => 'progress-bar-danger',
    'pending'      => 'sweep-progress-bar-pending',
  }

  # @param  [Sweep]  sweep
  # @return [String] a short textual representation of the status of a sweep
  def sweep_status(sweep)
    if sweep.count_pending > 0
      t(:snapshots_pending, count: sweep.count_pending)
    elsif sweep.count_under_review > 0
      t(:snapshots_under_review, count: sweep.count_under_review)
    elsif sweep.count_rejected > 0
      t(:snapshots_accepted_rejected,
        accepted: sweep.count_accepted, rejected: sweep.count_rejected)
    elsif sweep.count_accepted > 0
      t(:snapshots_all_accepted)
    elsif sweep.delay_seconds_remaining
      t(:snapshots_delayed)
    else
      t(:unknown)
    end
  end

  # @param  [Sweep]  sweep
  # @return [String] a stacked <div class="progress"/> Bootstrap element.
  # @see http://getbootstrap.com/components/#progress
  def sweep_progress_bar(sweep)
    total_count = PROGRESS_BAR_STYLE_MAPPINGS.keys.reduce(0) do |sum, state|
      sum + sweep.send("count_#{state}")
    end

    classes = %w(progress)
    classes += %w(progress-striped active) if sweep.count_pending > 0
    html_attrs = {
      class: classes,
      title: sweep_status(sweep),
      data: {
        auto_refresh_type: 'sweep',
        auto_refresh_id:   sweep.id,
      },
    }
    content_tag(:div, html_attrs) do
      PROGRESS_BAR_STYLE_MAPPINGS.map do |state, bootstrap_class|
        percent_number = if (total_count > 0)
                           sweep.send("count_#{state}") / total_count.to_f * 100
                         else
                           0
                         end
        percent = number_to_percentage(percent_number)
        content_tag(:div, nil, class: "progress-bar #{bootstrap_class}",
                               style: "width: #{percent}")
      end.join.html_safe
    end
  end
end
