class FinancialAid::CalculateScoreService < ApplicationService
  def initialize(application)
    @application = application
  end

  def call
    debt = (calculate_housing + calculate_utilities + calculated[:insurance] +
      calculate_taxes + calculate_variable_expenses)
    score = calculate_income / debt
    financial_contribution = calculate_income - debt
    @application.update(financial_contribution: financial_contribution, score: score.round(2))
  end

  private
    def answers
      @answers ||= @application.answers
    end

    def answer_value(question_id)
      answers.find { |answer| answer.question_id == question_id }&.answer.to_f
    end

     # Income calculation
  def calculate_income
    excess = ((calculated[:cash] + calculated[:investments]) - 200_000) * 0.04
    excess = 0 if excess < 0

    calculated[:income] + excess
  end

  # Housing calculation
  def calculate_housing
    options = [(calculated[:mortgage] * 12), (calculated[:income] * 0.3)].compact
    options.min
  end

  # Utilities calculation
  def calculate_utilities
    [calculated[:utilities], (calculated[:income] * 0.06)].min
  end


  # Taxes calculation
  def calculate_taxes
    [calculated[:taxes], (calculated[:income] * 0.2)].min
  end

  # Variable Expenses calculation
  def calculate_variable_expenses
    calculated_expenses = calculated[:alimony] + calculated[:medical] +
      calculated[:childcare] + calculated[:other] + (calculated[:loan] * 12)
    alternative_expenses = 23_891 + ((calculated[:dependents] - 2) * 3_133)
    [calculated_expenses, alternative_expenses].min
  end

  def calculated
    {
      income: answer_value(1), # Income - Annual
      mortgage: answer_value(2), # Housing - Mortgage or Rent - Monthly
      utilities: answer_value(4), # Utilities paid - Annual
      insurance: answer_value(5), # Insurance paid - Annual
      taxes: answer_value(6), # Taxes paid - Annual
      alimony: answer_value(7), # Child support, alimony paid - Annual
      medical: answer_value(8), # Medical expenses paid - Annual
      childcare: answer_value(9), # Childcare, elder care expenses - Annual
      other: answer_value(10), # Other expenses - Annual
      loan: answer_value(11), # Loan Payments - Monthly
      cash: answer_value(12), # Current value of cash, savings, checking accounts
      investments: answer_value(13), # Current net worth of investments
      dependents: answer_value(14), # Number of people in household
    }
  end
end
