require 'csv'

class Accounting::TransactionsCsv < ApplicationService
  include AccountingHelper

  def initialize(options)
    @category_id = options[:category_id]
    @action = options[:type].present? ? options[:type].to_sym : nil
    @date_range = options[:date_range]
    @school = options[:school]
    @void = options[:void]&.to_bool
  end

  def call
    transactions = @school.set_transaction_base(@action)
      .with_action(@action)
      .with_category(@category_id)
      .with_date_range(get_date_range(@date_range))
      .without_void(@void)
      .joins(subcategories: :category)
      .includes(:students, :subcategories)
      .references(:students, :subcategories)

    CSV.generate do |csv|
      csv << ['Date', 'Memo', 'Student', 'Category', 'Amount', 'Type']
      transactions.each do |transaction|
        csv << [
          transaction.decorate.posted_date,
          transaction.memo,
          transaction.student_name,
          transaction.category_name,
          transaction.decorate.currency,
          transaction.action.capitalize
        ]
      end
    end
  end
end
