# frozen_string_literal: true

module Decidim
  module ParticipatoryProcessGroups
    # This cell renders the filter tabs of participatory processes
    # in a group. It's inherited from ProcessFiltersCell of participatory
    # processes index but is based in the group processes
    #
    # The `model` must be a Decidim::ParticipatoryProcessGroup`
    #
    # Available options:
    #
    # - `:base_relation` => A relation of participatory processes. If not
    #   provided is based on the model processes using
    #   GroupPublishedParticipatoryProcesses query.
    # - `default_date_filter` => The date filter to use if not given by
    #    params. If not provided is inferred from the base relation
    #
    # Example:
    #
    # cell(
    #   "decidim/participatory_process_groups/process_filters",
    #   group,
    #   base_relation: group.participatory_processes.published,
    #   date_filter: "active"
    # )
    class ProcessFiltersCell < Decidim::ParticipatoryProcesses::ProcessFiltersCell
      def filter_link(filter)
        Decidim::ParticipatoryProcesses::Engine
          .routes
          .url_helpers
          .participatory_process_group_path(
            model,
            filter: {
              scope_id: get_filter(:scope_id),
              area_id: get_filter(:area_id),
              date: filter
            }
          )
      end

      def current_filter
        get_filter(:date, default_date_filter)
      end

      def base_relation
        @base_relation ||= options[:base_relation].presence || Decidim::ParticipatoryProcesses::GroupPublishedParticipatoryProcesses.new(
          model,
          current_user
        ).query
      end

      def process_count_by_filter
        @process_count_by_filter ||= begin
          counts = ALL_FILTERS.without("all").each_with_object({}) do |filter_name, collection_by_filter|
            collection_by_filter.update(filter_name => filtered_processes(filter_name).results.count)
          end
          counts.update("all" => counts.values.sum)
        end
      end

      def filtered_processes(date_filter)
        Decidim::ParticipatoryProcesses::ParticipatoryProcessSearch.new(
          base_relation: base_relation,
          date: date_filter,
          scope_id: get_filter(:scope_id),
          area_id: get_filter(:area_id),
          current_user: current_user,
          organization: current_organization
        )
      end

      def default_date_filter
        @default_date_filter ||= options[:default_filter].presence || process_count_by_filter.find { |_, count| count.positive? }&.first || "all"
      end
    end
  end
end