module ShiftsHelper
  def shift_vote_collection_dates(booth, polls)
    return [] if polls.blank?

    date_options((start_date(polls)..end_date(polls)), Poll::Shift.tasks[:vote_collection], booth)
  end

  def shift_recount_scrutiny_dates(booth, polls)
    return [] if polls.blank?

    dates = polls.map(&:ends_at).map(&:to_date).sort.reduce([]) do |total, date|
      initial_date = [date, Date.current].max
      total << (initial_date..date + Poll::RECOUNT_DURATION).to_a
    end
    date_options(dates.flatten.uniq, Poll::Shift.tasks[:recount_scrutiny], booth)
  end

  def date_options(dates, task_id, booth)
    valid_dates(dates, task_id, booth).map { |date| [l(date, format: :long), l(date)] }
  end

  def valid_dates(dates, task_id, booth)
    dates.reject { |date| officer_shifts(task_id, booth).include?(date) }
  end

  def start_date(polls)
    start_date = polls.map(&:starts_at).min.to_date
    [start_date, Date.current].max
  end

  def end_date(polls)
    polls.map(&:ends_at).max.to_date
  end

  def officer_select_options(officers)
    officers.map { |officer| [officer.name, officer.id] }
  end

  private

    def officer_shifts(task_id, booth)
      @officer.shifts.where(task: task_id, booth: booth).map(&:date)
    end
end
