module CanvasSync::JobBatches::RedisModel

def flush_pending_attrs

def flush_pending_attrs
  redis do |r|
    r.mapped_hmset(redis_key, @pending_attrs)
  end
  @initialized = true
  @pending_attrs = {}
end

def persist_bid_attr(attribute, value)

def persist_bid_attr(attribute, value)
  if @initialized || @existing
    redis do |r|
      r.multi do |r|
        r.hset(redis_key, attribute, value)
        r.expire(redis_key, Batch::BID_EXPIRE_TTL)
      end
    end
  else
    @pending_attrs ||= {}
    @pending_attrs[attribute] = value
  end
end

def read_bid_attr(attribute)

def read_bid_attr(attribute)
  redis do |r|
    r.hget(redis_key, attribute)
  end
end

def redis_attr(key, type = :string, read_only: true)

def redis_attr(key, type = :string, read_only: true)
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
    def #{key}=(value)
      raise "#{key} is read-only once the batch has been started" if #{read_only.to_s} && (@initialized || @existing)
      @#{key} = value
      if :#{type} == :json
        value = JSON.unparse(value)
      end
      persist_bid_attr('#{key}', value)
    end
    def #{key}
      return @#{key} if defined?(@#{key})
      if (@initialized || @existing)
        value = read_bid_attr('#{key}')
        if :#{type} == :bool
          value = value == 'true'
        elsif :#{type} == :int
          value = value.to_i
        elsif :#{type} == :float
          value = value.to_f
        elsif :#{type} == :json
          value = JSON.parse(value)
        elsif :#{type} == :symbol
          value = value&.to_sym
        end
        @#{key} = value
      end
    end
  RUBY
end