#!/usr/bin/env ruby

require 'pp'
require 'logger'
require 'dotenv'
require 'ruby-progressbar'
require_relative 'lib/validate'
require_relative 'lib/sheet'
require_relative 'lib/adjustments_expenses'
require_relative 'lib/repo'
require_relative 'lib/report'
require_relative 'lib/parse_commandline'

def sum_row_amounts(rows)
  amount = 0
  rows.each do | row |
    amount += row[:amount].to_f
  end

  amount
end

options = CommandlineParser.parse(ARGV)


Dotenv.load('.env', ".env.#{options[:environment]}")

adjustments_for_period_id = options[:period_id]
full_filename             = options[:input_file]
filename                  = File.basename(full_filename)
commit_run                = options[:commit_run]
output_type               = options[:output_type]
skip_validation           = options[:skip_validation]

if !commit_run && skip_validation
  puts "You are neither validating nor committing. Nothing to do here."
  exit
end

if skip_validation
  puts "Skipping Validation Step. Be sure the file is fully valid."
end

puts "Environment is #{ENV['running_environment'].upcase}"

if commit_run
  puts "Committing Run"
  parsed_sheet = Sheet.parse(full_filename)

  adjustments = Validate.run(adjustments_for_period_id, filename, Sheet.parse(full_filename), Repo.new, skip_validation)

  abort "There are #{adjustments.invalid_rows.count} invalid rows, cannot continue commit" if adjustments.invalid_rows.count > 0

  rows, batch_id, sum_ingested = AdjustmentsExpenses.commit(filename, adjustments_for_period_id, adjustments.all_rows, Repo.new)
  Report.run(filename, rows, batch_id, 'files/_finished', output_type)

  puts
  puts "Sum of amount in sheet: #{sum_row_amounts(parsed_sheet)}"
  puts "Sum of amount of ingested adjustments: #{sum_ingested.to_f}"

  puts
  puts "Invalid rows: #{adjustments.invalid_rows.count}"
  puts "Valid rows: #{adjustments.valid_rows.count}"

  puts
  puts "ASK SOMEONE TO APPLY THIS BEFORE IMPORTING MORE FILES!"

else
  puts "Validating only"
  parsed_sheet = Sheet.parse(full_filename)

  adjustments = Validate.run(adjustments_for_period_id, filename, parsed_sheet, Repo.new, skip_validation)
  Report.run(filename, adjustments.all_rows, '', 'files/_finished', output_type)

  puts
  puts "Summed Amount In Sheet: #{sum_row_amounts(parsed_sheet)}"

  puts
  puts "Invalid rows: #{adjustments.invalid_rows.count}"
  puts "Valid rows: #{adjustments.valid_rows.count}"
end

