module Support
  module Logs
    class Browser
      UNRETURNED_PROMISE_REGEX = /promise was created/

      def initialize(browser_logs)
        @raw_logs = browser_logs
        @unreturned_promises = []
        @other_messages = []
        process
      end

      def unreturned_promises?
        !@unreturned_promises.empty?
      end

      def empty?
        @unreturned_promises.empty? && @other_messages.empty?
      end

      def print_output
        Kernel.puts output
        fail(
          "Found unreturned promises! If you don't want to fail on this,"\
          " then update your cucumber profile."
        ) if unreturned_promises? && MISC_SETTINGS[:fail_on_unreturned_promises]
      end

      private

      def output
        message = "[browser]\n"
        if unreturned_promises?
          message += \
            "  found unreturned promise(s):\n"\
            "  #{@unreturned_promises.join("  \n")}"
        end
        unless @other_messages.empty?
          message += \
            "  found console messages:\n"\
            "  #{@other_messages.join("  \n")}"
        end
        message
      end

      def process
        browser_logs = @raw_logs.dup
        @output = "[browser]\n"
        browser_logs.each do |browser_log|
          message = browser_log.to_s
          if message.match UNRETURNED_PROMISE_REGEX
            @unreturned_promises << message
            browser_logs.delete(browser_log)
          else
            @other_messages << message
          end
        end
      end
    end
  end
end
