module CurationConcerns
  class ResourceStatisticsSource
    attr_accessor :search_builder, :repository
    def initialize(search_builder: ::CurationConcerns::AdminController.new.search_builder, repository: ::CurationConcerns::AdminController.new.repository)
      # Remove gated discovery.
      @search_builder = search_builder.except(:add_access_controls_to_solr_params)
      @repository = repository
      solr_arguments[:fq] ||= []
      solr_arguments[:rows] = 0
    end

    def open_concerns_count
      results_count(public_read_group)
    end

    def authenticated_concerns_count
      results_count(registered_read_group)
    end

    def restricted_concerns_count
      results_count([not_registered_read_group, not_public_read_group])
    end

    def expired_embargo_now_authenticated_concerns_count
      results_count([registered_read_group, embargo_history_query])
    end

    def expired_embargo_now_open_concerns_count
      results_count([public_read_group, embargo_history_query])
    end

    def active_embargo_now_authenticated_concerns_count
      results_count([registered_read_group, active_embargo])
    end

    def active_embargo_now_restricted_concerns_count
      results_count([not_registered_read_group, not_public_read_group, active_embargo])
    end

    def expired_lease_now_authenticated_concerns_count
      results_count([registered_read_group, lease_history_query])
    end

    def expired_lease_now_restricted_concerns_count
      results_count([not_registered_read_group, not_public_read_group, lease_history_query])
    end

    def active_lease_now_authenticated_concerns_count
      results_count([registered_read_group, active_lease])
    end

    def active_lease_now_open_concerns_count
      results_count([public_read_group, active_lease])
    end

    private

      def solr_arguments
        @solr_arguments ||= search_builder.to_h
      end

      def results_count(query)
        q = { fq: Array.wrap(query) }
        repository.search(solr_arguments.merge(q) do |_key, v1, v2|
          v1 + v2
        end)["response"]["numFound"]
      end

      def active_lease
        "lease_expiration_date_dtsi:[NOW TO *]"
      end

      def active_embargo
        "embargo_release_date_dtsi:[NOW TO *]"
      end

      def lease_history_query
        "lease_history_ssim:*"
      end

      def embargo_history_query
        "embargo_history_ssim:*"
      end

      def registered_read_group
        "#{Hydra.config.permissions.read.group}:registered"
      end

      def not_registered_read_group
        "-#{registered_read_group}"
      end

      def public_read_group
        "#{Hydra.config.permissions.read.group}:public"
      end

      def not_public_read_group
        "-#{public_read_group}"
      end
  end
end