# frozen_string_literal: true

module Jobs
  class OldKeysReminder < ::Jobs::Scheduled
    every 1.month

    OLD_CREDENTIALS_PERIOD = 2.years

    def execute(_args)
      return if SiteSetting.send_old_credential_reminder_days.to_i == 0
      return if message_exists?
      return if old_site_settings_keys.blank? && old_api_keys.blank?

      PostCreator.create!(
        Discourse.system_user,
        title: title,
        raw: body,
        archetype: Archetype.private_message,
        target_usernames: admins.map(&:username),
        validate: false,
      )
    end

    private

    def old_site_settings_keys
      @old_site_settings_keys ||=
        SiteSetting
          .secret_settings
          .each_with_object([]) do |secret_name, old_keys|
            site_setting = SiteSetting.find_by(name: secret_name)
            next if site_setting&.value.blank?
            next if site_setting.updated_at + OLD_CREDENTIALS_PERIOD > Time.zone.now
            old_keys << site_setting
          end
          .sort_by { |key| key.updated_at }
    end

    def old_api_keys
      @old_api_keys ||=
        ApiKey
          .all
          .order(created_at: :asc)
          .each_with_object([]) do |api_key, old_keys|
            next if api_key.created_at + OLD_CREDENTIALS_PERIOD > Time.zone.now
            old_keys << api_key
          end
    end

    def admins
      User.real.admins
    end

    def message_exists?
      message = Topic.private_messages.with_deleted.find_by(title: title)
      message &&
        message.created_at + SiteSetting.send_old_credential_reminder_days.to_i.days > Time.zone.now
    end

    def title
      I18n.t("old_keys_reminder.title")
    end

    def body
      I18n.t("old_keys_reminder.body", keys: keys_list)
    end

    def keys_list
      messages =
        old_site_settings_keys.map { |key| "#{key.name} - #{key.updated_at.to_date.to_fs(:db)}" }
      old_api_keys.each_with_object(messages) do |key, array|
        array << "#{[key.description, key.user&.username, key.created_at.to_date.to_fs(:db)].compact.join(" - ")}"
      end
      messages.join("\n")
    end
  end
end