# frozen_string_literal: true

class Org

  class TotalCountStatService

    class << self

      def call
        total = build_from_joined_user
        build_from_created_plan(total)
        total.values
      end

      private

      def build_model(org_name:, total_users: 0, total_plans: 0)
        {
          org_name: org_name,
          total_users: total_users,
          total_plans: total_plans
        }
      end

      def reducer_body(acc, count, key_target)
        org_name = count[:org_name]
        count = count[:count]

        if acc[org_name].present?
          acc[org_name][key_target] = count
        else
          args = { org_name: org_name }
          args[key_target] = count
          acc[org_name] = build_model(args)
        end

        acc
      end

      def build_from_joined_user(total = {})
        joined_user_count = Org::TotalCountJoinedUserService.call
        joined_user_count.reduce(total) do |acc, count|
          reducer_body(acc, count, :total_users)
        end
      end

      def build_from_created_plan(total = {})
        created_plan_count = Org::TotalCountCreatedPlanService.call
        created_plan_count.reduce(total) do |acc, count|
          reducer_body(acc, count, :total_plans)
        end
      end

    end

  end

end
