# frozen_string_literal: true

module Email
  class Cleaner
    def initialize(mail, remove_attachments: true, truncate: true, rejected: false)
      @mail = Mail.new(mail)
      @mail.charset = "UTF-8"
      @remove_attachments = remove_attachments
      @truncate = truncate
      @rejected = rejected
    end

    def execute
      @mail.without_attachments! if @remove_attachments
      truncate! if @truncate
      remove_null_byte(@mail.to_s)
    end

    def self.delete_rejected!
      IncomingEmail.delete_by(
        "rejection_message IS NOT NULL AND created_at < ?",
        SiteSetting.delete_rejected_email_after_days.days.ago,
      )
    end

    private

    def truncate!
      parts.each { |part| part.body = part.body.decoded.truncate(truncate_limit, omission: "") }
    end

    def parts
      @mail.multipart? ? @mail.parts : [@mail]
    end

    def truncate_limit
      @rejected ? SiteSetting.raw_rejected_email_max_length : SiteSetting.raw_email_max_length
    end

    def remove_null_byte(message)
      message.gsub!("\x00", "")
      message
    end
  end
end