# frozen_string_literal: true

module Jobs

  class PendingUsersReminder < ::Jobs::Scheduled
    every 1.hour

    def execute(args)
      if SiteSetting.must_approve_users && SiteSetting.pending_users_reminder_delay >= 0
        query = AdminUserIndexQuery.new(query: 'pending', stats: false).find_users_query # default order is: users.created_at DESC
        if SiteSetting.pending_users_reminder_delay > 0
          query = query.where('users.created_at < ?', SiteSetting.pending_users_reminder_delay.hours.ago)
        end

        newest_username = query.limit(1).select(:username).first&.username

        return true if newest_username == previous_newest_username # already notified

        count = query.count

        if count > 0
          target_usernames = Group[:moderators].users.map do |user|
            next if user.bot?

            unseen_count = user.notifications.joins(:topic)
              .where("notifications.id > ?", user.seen_notification_id)
              .where("notifications.read = false")
              .where("topics.subtype = ?", TopicSubtype.pending_users_reminder)
              .count

            unseen_count == 0 ? user.username : nil
          end.compact

          unless target_usernames.empty?
            PostCreator.create(
              Discourse.system_user,
              target_usernames: target_usernames,
              archetype: Archetype.private_message,
              subtype: TopicSubtype.pending_users_reminder,
              title: I18n.t("system_messages.pending_users_reminder.subject_template", count: count),
              raw: I18n.t("system_messages.pending_users_reminder.text_body_template", count: count, base_url: Discourse.base_url)
            )

            self.previous_newest_username = newest_username
          end
        end
      end

      true
    end

    def previous_newest_username
      Discourse.redis.get previous_newest_username_cache_key
    end

    def previous_newest_username=(username)
      Discourse.redis.setex previous_newest_username_cache_key, 7.days, username
    end

    def previous_newest_username_cache_key
      "pending-users-reminder:newest-username"
    end

  end

end