require_relative 'browser_manager'
require 'pry'
require 'progress_bar'
require 'terminal-table'
require_relative '../string_helper'
require 'active_support/core_ext/array/grouping'

module QAHelpers
  class JenkinsBuildParser
    attr_reader :params, :browsers

    def initialize(params={})
      @params = default_params.merge(params)
      $progress_bar = ProgressBar.new(@params[:builds_to_consider])
      @browser_manager = BrowserManager.new(@params)
      @browsers = @browser_manager.browsers
    end

    def parse
      puts "Getting e2e status for last #{params[:builds_to_consider]} builds using #{browsers.count} workers".green

      # 1. Logging in
      browsers.first.log_in(params)
      cookies = browsers.first.cookies
      browsers.each do |browser|
        browser.session.visit(params[:jenkins_host])
        browser.add_cookies(cookies)
      end

      # 2. Navigating to the job we need
      browsers.first.session.visit job_url

      # 3. Getting the last build
      build_id = browsers.first.last_build_id

      threads = []
      @parse_results = []
      portions = (build_id-params[:builds_to_consider]..build_id).to_a.drop(1).in_groups(browsers.count, false)
      browsers.each_with_index do |b, i|
        threads << Thread.new do
          @parse_results << b.parse_builds(build_report_urls(portions[i]))
        end
      end
      threads.map(&:join)

      # 4. Getting results
      results = @parse_results.flatten

      # 5. Preparing results
      prepared_results = {}
      results.map { |x| x[:features] }.each do |build|
        build.each do |feature_name, details|
          prepared_results[feature_name] ||= { passed: 0, failed: 0 }
          prepared_results[feature_name][:passed] += details[:passed]
          prepared_results[feature_name][:failed] += details[:failed]
        end
      end

      prepared_results.each do |_feature, details|
        details[:passing] = (details[:passed].to_f / (details[:passed].to_f+details[:failed].to_f) * 100).round(2)
      end

      # 6. Stdout results
      headings = %w[ Feature Runs Passed Failed Pass\ Rate ]
      rows = prepared_results.sort_by{|_k,v| v[:passing]}.map do |feature, details|
        [ feature, (details[:passed]+details[:failed]).to_s.blue,
          details[:passed].to_s.green, details[:failed].to_s.red, "#{details[:passing]}%".yellow ]
      end
      table = Terminal::Table.new :headings => headings, :rows => rows
      puts table
    end

    def default_params
      {
        jenkins_host: ENV['JENKINS_HOST'] || 'http://jenkins.theorchard.com:8080',
        job_name: ENV['CUCUMBER_LEGACY_JOB_NAME'] || 'cucumber-tests-legacy-runthrough',
        default_sleep: 2,
        builds_to_consider: 20
      }
    end

    private

    def job_url
      "#{params[:jenkins_host]}/job/#{params[:job_name]}"
    end

    def build_report_url(id)
      "#{job_url}/#{id}/cucumber-html-reports"
    end

    def build_report_urls(ids)
      ids.map { |id| build_report_url(id) }
    end
  end
end
