require_relative './commit/adjustments'
require_relative './commit/expenses'
require_relative './commit/prep_adjustments'

class AdjustmentsExpenses
  attr_reader :rows, :statement_period_id, :sum_ingested

  def self.commit(filename, period_id, rows, repo)
    report = AdjustmentsExpenses.new(filename, period_id, rows, repo)
    report.execute
    return report.rows, report.statement_period_id, report.sum_ingested
  end

  def initialize(filename, period_id, rows, repo)
    @filename = filename
    @period_id = period_id
    @rows = rows
    @repo = repo
    @expense_record_ids = []
    @statement_period_id = nil
    @sum_ingested = nil
  end

  def execute
    event_id, @statement_period_id = PrepAdjustments.execute(@repo, @period_id, @filename)
    commit_rows(event_id)
    Expenses.insert_aggregated_expenses(@repo, @expense_record_ids, event_id) if @expense_record_ids.any?

    @sum_ingested = @repo.get_sum_of_ingested_adjustments(@statement_period_id)
  end

  def commit_rows(event_id)
    progressbar = ProgressBar.create(:title => "Committing", :starting_at => 0, :total => @rows.count)

    @rows.each do | row |
      progressbar.increment

      row[:adjustment_type_id] = @repo.get_adjustment_type_id(row[:adjustment_type])
      row[:apply_period_id]    = @repo.get_period_id(row[:apply_month], row[:apply_year])
      row[:activity_period_id] = @repo.get_period_id(row[:activity_month], row[:activity_year])

      row[:record_id] = nil
      next if row[:reasons].any?

      if expense?(row)
        @expense_record_ids << Expenses.insert_expense(@repo, row)
      else
        Adjustments.insert_adjustment(@repo, event_id, row)
      end
    end
  end

  def expense?(row)
    row[:upc] && row[:distribution_type]
  end
end
