class Internal::Cafeteria::TransactionsController < Internal::Controller
  def create
    @transaction = family.accounting_transactions.build(transaction_params)
    transaction.student_cafeteria_transaction = cafeteria_transaction

    transaction.process_payment(payment_params) if !transaction.increase? && transaction.payment?

    if transaction.save
      allocate_funds
      render_success :ok
    else
      render_error :unprocessable_entity, errors: transaction
    end
  end

  def update
    transaction.assign_attributes(transaction_params)
    transaction_detail.assign_attributes(amount: params[:amount], subcategory: config.subcategory)

    if transaction.remove_allocations_and_update(transaction_detail)
      allocate_funds
      render_success :ok
    else
      render_error :unprocessable_entity, errors: transaction
    end
  end

  def destroy
    if cafeteria_transaction.destroy
      render_success :ok
    else
      render_error :unprocessable_entity
    end
  end

  private
    def transaction
      @transaction ||= cafeteria_transaction.accounting_transaction
    end

    def transaction_detail
      @transaction_detail ||= transaction.transaction_details.first
    end

    def cafeteria_transaction
      @cafeteria_transaction ||= family.student_cafeteria_transactions
        .find_by(id: params[:cafeterium_id])
    end

    def config
      @config ||= current_school.accounting_cafeteria_config
    end

    def family
      @family ||= current_school.families.find_by(id: params[:family_id])
    end

    def student
      @student ||= family.all_students.find_by(id: params[:student_id])
    end

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

    def payment_params
      {}.tap do |props|
        props[:payment] = params[:payment_method]
        props[:check] = { check_number: params[:check] } if props[:payment] == 'check'
      end
    end

    def transaction_params
      params.permit(:amount, :memo, :type, :posted_on).merge(
        action: params[:action_type],
        student: student,
        subcategory: config.subcategory
      )
    end
end
