module Outputtable

  def data_to_output
    @list || @show
  end

  def outputter
    raise 'You should use "output_with" method to define outputter' unless self.class.outputter_class
    @outputter ||= self.class.outputter_class.new(data_to_output, options.merge(current_command: @command))
  end

  def output(options={})
    outputter.output(options)
  end

  def report_url(job_id)
    create_url "task/#{job_id}/report"
  end

  def reports_urls(job_ids)
    raise "Parameter should be an array of strings" unless job_ids.is_a?(Array)
    job_ids.map do |job_id|
      report_url(job_id)
    end.join("\n")
  end

  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    attr_reader :outputter_class
    def output_with(klass)
      @outputter_class = klass
    end
  end

end
