module Exporter
  class Comments
    attr_reader :name, :user

    def initialize(user)
      @name = :comments
      @user = user
    end

    def export(id_code: nil)
      comments = user.comments
      comments = comments.where(id_code: id_code) if id_code.present?

      { "#{name}.json" => jsonify(comments) }
    end

    private

    def allowed_attributes
      %i[
        body_markdown
        created_at
        deleted
        edited
        edited_at
        id_code
        markdown_character_count
        public_reactions_count
        processed_html
        receive_notifications
      ]
    end

    def jsonify(comments)
      comments_to_jsonify = []

      # the commentable polymorphic attributes are added to the select for the "includes" to work
      attributes_to_select = %i[id commentable_id commentable_type] + allowed_attributes
      comments.includes(:commentable).select(attributes_to_select).find_each do |comment|
        # merge final json with the path of the commentable
        comments_to_jsonify << comment.as_json(only: allowed_attributes)
          .merge(commentable_path: comment.commentable&.path)
      end

      comments_to_jsonify.to_json
    end
  end
end
