class Accounting::CafeteriaService < ApplicationService
  def initialize(ids, subcategory_id)
    @ids = ids
    @subcategory_id = subcategory_id
  end

  def call
    cafeteria_transactions.each do |cafeteria_transaction|
      transaction = cafeteria_transaction.build_accounting_transaction(subcategory)
      transaction.student_cafeteria_transaction = cafeteria_transaction

      cafeteria_transaction.process_payment(transaction) if cafeteria_transaction.payment?

      transaction.save!

      allocate_funds(transaction.family, transaction.student)
    end
  end

  private
    def cafeteria_transactions
      @cafeteria_transactions ||= StudentCafeteriaTransaction
        .includes(:student)
        .left_joins(:accounting_cafeteria_transaction)
        .where(accounting_cafeteria_transactions: { id: nil })
        .where(id: @ids)
    end

    def subcategory
      @subcategory ||= Accounting::Subcategory.find_by(id: @subcategory_id)
    end

    def allocate_funds(family, student)
      AllocationJob.perform_now(family, subcategory, student: student)
    end
end
