# frozen_string_literal: true

class PostOwnerChanger
  def initialize(params)
    @post_ids = params[:post_ids]
    @topic = Topic.with_deleted.find_by(id: params[:topic_id].to_i)
    @new_owner = params[:new_owner]
    @acting_user = params[:acting_user]
    @skip_revision = params[:skip_revision] || false

    %i[post_ids topic new_owner acting_user].each do |arg|
      raise ArgumentError.new(arg) if self.instance_variable_get("@#{arg}").blank?
    end
  end

  def change_owner!
    @post_ids.each do |post_id|
      next unless post = Post.with_deleted.find_by(id: post_id, topic_id: @topic.id)

      if post.is_first_post?
        @topic.user = @new_owner
        @topic.recover! if post.user.nil?
      end

      post.topic = @topic
      post.set_owner(@new_owner, @acting_user, @skip_revision)
      PostActionDestroyer.destroy(@new_owner, post, :like, skip_delete_check: true)

      level = post.is_first_post? ? :watching : :tracking
      TopicUser.change(
        @new_owner.id,
        @topic.id,
        notification_level: NotificationLevels.topic_levels[level],
        posted: true,
      )

      if post ==
           @topic
             .posts
             .order("post_number DESC")
             .where("NOT hidden AND posts.deleted_at IS NULL")
             .first
        @topic.last_poster = @new_owner
      end

      @topic.update_statistics

      @new_owner.user_stat.update(
        first_post_created_at: @new_owner.reload.posts.order("created_at ASC").first&.created_at,
      )

      Post.where(topic_id: @topic.id, reply_to_post_number: post.post_number).update_all(
        reply_to_user_id: @new_owner.id,
      )

      @topic.save!(validate: false)
    end
  end
end