class Commander::UI::ProgressBar

def completed?

def completed?
  @step == @total_steps
end

def erase_line

def erase_line
  # highline does not expose the output stream
  HighLine.default_instance.instance_variable_get('@output').print "\r\e[K"
end

def finished?

def finished?
  @step == @total_steps + 1
end

def generate_tokens

def generate_tokens
  {
    title: @title,
    percent_complete: percent_complete,
    progress_bar: progress_bar,
    step: @step,
    steps_remaining: steps_remaining,
    total_steps: @total_steps,
    time_elapsed: format('%0.2fs', time_elapsed),
    time_remaining: @step.positive? ? format('%0.2fs', time_remaining) : '',
  }.merge! @tokens
end

def increment(tokens = {})

def increment(tokens = {})
  @step += 1
  @tokens.merge! tokens if tokens.is_a? Hash
  show
end

def initialize(total, options = {})

def initialize(total, options = {})
  @total_steps, @step, @start_time = total, 0, Time.now
  @title = options.fetch :title, 'Progress'
  @width = options.fetch :width, 25
  @progress_str = options.fetch :progress_str, '='
  @incomplete_str = options.fetch :incomplete_str, '.'
  @complete_message = options.fetch :complete_message, 'Process complete'
  @format = options.fetch :format, ':title |:progress_bar| :percent_complete% complete '
  @tokens = options.fetch :tokens, {}
end

def percent_complete

def percent_complete
  if @total_steps.zero?
    100
  else
    @step * 100 / @total_steps
  end
end

def progress_bar

def progress_bar
  (@progress_str * (@width * percent_complete / 100)).ljust @width, @incomplete_str
end

def show

def show
  return if finished?
  erase_line
  if completed?
    HighLine.default_instance.say UI.replace_tokens(@complete_message, generate_tokens) if @complete_message.is_a? String
  else
    HighLine.default_instance.say UI.replace_tokens(@format, generate_tokens) << ' '
  end
end

def steps_remaining

def steps_remaining
  @total_steps - @step
end

def time_elapsed

def time_elapsed
  Time.now - @start_time
end

def time_remaining

def time_remaining
  (time_elapsed / @step) * steps_remaining
end