# frozen_string_literal: true

require "yaml"
require "erb"
require "fileutils"

require "spout/helpers/subject_loader"
require "spout/models/outlier_result"
require "spout/helpers/number_helper"
require "spout/helpers/config_reader"

module Spout
  module Commands
    class Outliers
      include Spout::Helpers::NumberHelper

      def initialize(standard_version, argv)
        @standard_version = standard_version
        @console = (argv.delete("--console") != nil)

        @variable_files = Dir.glob("variables/**/*.json")
        @valid_ids = []
        @number_of_rows = nil

        @config = Spout::Helpers::ConfigReader.new

        @subject_loader = Spout::Helpers::SubjectLoader.new(@variable_files, @valid_ids, @standard_version, @number_of_rows, @config.visit)
        @subject_loader.load_subjects_from_csvs!
        @subjects = @subject_loader.subjects
        run_outliers_report!
      end

      def run_outliers_report!
        puts "Generating: outliers.html\n\n"

        @outlier_results = @subject_loader.all_methods.collect do |method, csv_files|
          Spout::Models::OutlierResult.new(@subjects, method, csv_files)
        end

        @outlier_results.select!{|outlier_result| ["numeric", "integer"].include?(outlier_result.variable_type) }
        @outlier_results.sort!{|a,b| [a.weight, a.method] <=> [b.weight, b.method]}

        @overall_results = @subject_loader.csv_files.collect do |csv_file|
          major_outliers = @outlier_results.select{|outlier_result| outlier_result.csv_files.include?(csv_file) and outlier_result.weight == 0 }.count
          minor_outliers = @outlier_results.select{|outlier_result| outlier_result.csv_files.include?(csv_file) and outlier_result.weight == 1 }.count
          total_outliers = major_outliers + minor_outliers
          [ csv_file, major_outliers, minor_outliers, total_outliers ]
        end

        coverage_folder = File.join(Dir.pwd, "coverage")
        FileUtils.mkpath coverage_folder
        html_file = File.join(coverage_folder, "outliers.html")

        File.open(html_file, "w+") do |file|
          erb_location = File.join( File.dirname(__FILE__), "../views/outliers.html.erb" )
          file.puts ERB.new(File.read(erb_location)).result(binding)
        end

        unless @console
          open_command = "open"  if RUBY_PLATFORM.match(/darwin/) != nil
          open_command = "start" if RUBY_PLATFORM.match(/mingw/) != nil

          system "#{open_command} #{html_file}" if ["start", "open"].include?(open_command)
        end
        puts "#{html_file}\n\n"
        return self
      end
    end
  end
end