class Admin::Accounting::FamiliesController < Admin::Accounting::Controller
  include CacheHelper

  def index
    families = current_school.families
      .current_status(params[:status]&.to_sym)
      .with_outstanding_balance(params[:balance]&.to_bool)
      .ordered
      .distinct
    render_success :ok, json: families.map { |f| family_props(f) }
  end

  def show
    render_success :ok, json: family_props(family).merge(subcategories: breakdown)
  end

  def statement
    Reporting::Accounting::FamilyStatementJob.perform_async(
      current_school.id,
      current_user.id,
      ids: params[:ids],
      category_ids: params[:category_ids],
      statement_type: params[:type],
      dates: params[:dates]
    )
    render_success :ok
  end

  def balance_report
    Reporting::Accounting::FamilyBalanceJob.perform_async(
      current_school.id,
      current_user.id,
      family_ids: params[:ids]
    )
  end

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

    def subcategories
      current_school.accounting_subcategories
        .with_transactions_by_family(family)
        .with_recent_activity(true)
        .distinct
    end

    def family_props(family)
      balances = family_balances(family)
      {
        id: family.id,
        name: family.name,
        outstanding: sprintf('%.2f', balances['outstanding']),
        unallocated: sprintf('%.2f', balances['unallocated'])
      }
    end

    def family_balances(family)
      load_cache("family/#{family.id}/balance", false) do
        {
          outstanding: family.outstanding_balance,
          unallocated: family.unallocated_balance
        }.to_json
      end
    end

    def breakdown
      subcategories.map do |subcategory|
        {
          subcategory_id: subcategory.id,
          name: subcategory.decorate.title,
          outstanding:
            sprintf('%.2f', family.balance(:increase, subcategory.id, params[:student_id])),
          unallocated:
            sprintf('%.2f', family.balance(:decrease, subcategory.id, params[:student_id]))
        }
      end
    end

    def permissions
      if [:index, :show, :statement, :balance].include?(action_name.to_sym)
        ['read', 'write', 'manage']
      else
        ['write', 'manage']
      end
    end
end
