# coding: utf-8
RSpec::Support.require_rspec_core "formatters/base_text_formatter"
module RSpec
  module Core
    module Formatters

      class Dots < BaseTextFormatter

        Formatters.register self, :example_passed, :example_pending, :example_started,
              :example_failed, :start, :dump_failures
        attr_accessor :passes, :fails, :runs, :pendings, :screen_width, :start_time, :example_start, :debug

        def initialize(output)
          @passes = 0
          @fails = 0
          @runs = 0
          @pendings = 0
          @screen_width = `tput cols`.to_i - 1
          @debug = false
          super(output)
        end

        def start(notification)
          @start_time = Time.now
          @example_count = notification.count
          output.puts #new line
        end

        def example_started(example)
          @example_start = Time.now
          print_progress(example)
        end

        def example_pending(example)
          @runs += 1
          @pendings += 1
          print_progress(example, true)
        end

        def example_passed(example)
          @runs += 1
          @passes += 1
          print_progress(example, true)
        end

        def example_failed(example)
          @fails += 1
          @runs += 1
          failure = ConsoleCodes.wrap("\r Failed example: ", :failure) +
                    ConsoleCodes.wrap(example.example.full_description, :white)
          output.puts failure[0..@screen_width].ljust(@screen_width) unless @debug
          print_progress(example, true)
        end


        def dump_summary(summary)
          output.puts
          output.puts
          colour = (@fails == 0)? :success : :failure

          output.puts ConsoleCodes.wrap("┌" + "-".ljust(50,"-")  + "┐", colour)
          output.puts ConsoleCodes.wrap("│   #{summary.example_count} test#{summary.example_count == 1? '' : 's'}".ljust(50) + " |", colour)
          output.puts ConsoleCodes.wrap("|   #{@fails} failure#{@fails == 1? '' : 's'}".ljust(50) + " |", colour)
          output.puts ConsoleCodes.wrap("|   Ran in #{Helpers.format_duration summary.duration}".ljust(50) + " |", colour)
          output.puts ConsoleCodes.wrap("└" + "-".ljust(50,"-")  + "┘", colour)
          output.puts
          output.puts summary.colorized_rerun_commands if @fails > 0
        end

        def dump_failures(notification)
           output.puts
           output.puts notification.fully_formatted_failed_examples if @fails > 0
        end

        def print_progress(example, finish = false)

          tot = ConsoleCodes.wrap("#{@example_count}", :white)
          fls = ConsoleCodes.wrap("#{fails}", :failure)
          suc = ConsoleCodes.wrap("#{@runs - @fails}", :success)
          png = ConsoleCodes.wrap("#{@pendings}", :pending)
          current_dur = Time.now - @start_time
          prev_dur = Time.now - @example_start
          tim = ConsoleCodes.wrap( "(Running #{Helpers.format_duration current_dur})", :cyan)
          dot = ConsoleCodes.wrap(" ● ", @fails == 0 ? :success : :failure)

          if @debug
            run = ConsoleCodes.wrap(" Just ran: #{example.example.description}, which took ", :cyan)
            tim2 = ConsoleCodes.wrap(Helpers.format_duration(prev_dur), :red)
            output.puts " #{dot}#{suc}:#{fls}:#{png}/#{tot}#{dot} #{run}#{tim2}" if finish
          else
            run = ConsoleCodes.wrap(" Now running: #{example.example.description}", :cyan) unless finish
            all = "\r  #{dot}#{suc}:#{fls}:#{png} / #{tot}#{dot} #{tim} #{run}".ljust(@screen_width)+"\r"
            output.print all
          end
        end

      end
    end
  end
end