# frozen_string_literal: true

class Chat::Api::HintsController < ApplicationController
  before_action :ensure_logged_in

  def check_group_mentions
    RateLimiter.new(current_user, "group_mention_hints", 5, 10.seconds).performed!
    group_names = params[:mentions]

    raise Discourse::InvalidParameters.new(:mentions) if group_names.blank?

    visible_groups =
      Group.where("LOWER(name) IN (?)", group_names).visible_groups(current_user).pluck(:name)

    mentionable_groups = filter_mentionable_groups(visible_groups)

    result = {
      unreachable: visible_groups - mentionable_groups.map(&:name),
      over_members_limit:
        mentionable_groups
          .select { |g| g.user_count > SiteSetting.max_users_notified_per_group_mention }
          .map(&:name),
    }

    result[:invalid] = (group_names - result[:unreachable]) - result[:over_members_limit]

    render json: result
  end

  private

  def filter_mentionable_groups(group_names)
    return [] if group_names.empty?

    Group
      .select(:name, :user_count)
      .where(name: group_names)
      .mentionable(current_user, include_public: false)
  end
end