# frozen_string_literal: true

class Antispam
  include Redisable

  ACCOUNT_AGE_EXEMPTION = 1.week.freeze

  class SilentlyDrop < StandardError
    attr_reader :status

    def initialize(status)
      super()

      @status = status

      status.created_at = Time.now.utc
      status.id = Mastodon::Snowflake.id_at(status.created_at)
      status.in_reply_to_account_id = status.thread&.account_id

      status.delete # Make sure this is not persisted
    end
  end

  def local_preflight_check!(status)
    return unless spammy_texts.any? { |spammy_text| status.text.include?(spammy_text) }
    return unless status.thread.present? && !status.thread.account.following?(status.account)
    return unless status.account.created_at >= ACCOUNT_AGE_EXEMPTION.ago

    report_if_needed!(status.account)

    raise SilentlyDrop, status
  end

  private

  def spammy_texts
    redis.smembers('antispam:spammy_texts')
  end

  def report_if_needed!(account)
    return if Report.unresolved.exists?(account: Account.representative, target_account: account)

    Report.create!(account: Account.representative, target_account: account, category: :spam, comment: 'Account automatically reported for posting a banned URL')
  end
end