# frozen_string_literal: true

class PushUpdateWorker
  include Sidekiq::Worker
  include Redisable

  def perform(account_id, status_id, timeline_id = nil, options = {})
    @status      = Status.find(status_id)
    @account_id  = account_id
    @timeline_id = timeline_id || "timeline:#{account_id}"
    @options     = options.symbolize_keys

    render_payload!
    publish!
  rescue ActiveRecord::RecordNotFound
    true
  end

  private

  def render_payload!
    @payload = StatusCacheHydrator.new(@status).hydrate(@account_id)
  end

  def message
    JSON.generate({
      event: update? ? :'status.update' : :update,
      payload: @payload,
    }.as_json)
  end

  def publish!
    redis.publish(@timeline_id, message)
  end

  def update?
    @options[:update]
  end
end
