class SvelteOnRails::Lib::SvelteAttributes

def calculate_instance(record, attributes, call_stack: 0, offset: nil, limit: nil)

def calculate_instance(record, attributes, call_stack: 0, offset: nil, limit: nil)
  next_stack = call_stack + 1
  if record.respond_to?(:each)
    recs2 = if offset || limit
              if (record.is_a?(ActiveRecord::Relation) || record.is_a?(ActiveRecord::Associations::CollectionProxy) rescue false)
                _recs = (offset ? record.offset(offset) : record)
                (limit ? _recs.limit(limit) : _recs)
              elsif record.respond_to?(:drop) && record.respond_to?(:take) # that might be a array
                _recs = offset ? record.drop(offset) : record
                limit ? _recs.take(limit) : _recs
              else
                raise "[svelte-on-rails:to_svelte] unknown class for records: #{record}"
              end
            else
              record
            end
    set_labels(record.first, attributes)
    values = recs2.map do |rec|
      calculate_instance(rec, attributes, call_stack: next_stack)
    end
  else
    # we have a single record
    values = {}
    set_labels(record, attributes)
    attributes.each do |attr|
      if attr.is_a? Hash
        # we have associations
        attr.each do |key, value|
          next if ['offset', 'limit'].include?(key.to_s)
          _offset, _limit, _value = extract_limit(value)
          _key = key.to_s
          # inspect association and set_labels
          reflect = record.class.reflect_on_association(_key)
          raise "invalid association: #{_key}" unless reflect
          set_labels(reflect, value)
          # values
          recs = record.send(_key)
          if recs.present?
            if recs.respond_to?(:each)
              values[_key] = calculate_instance(
                recs,
                value,
                call_stack: next_stack,
                offset: _offset,
                limit: _limit
              )
            else
              values[_key] = calculate_instance(
                recs,
                value,
                call_stack: next_stack
              )
            end
          end
        end
      else
        # we have attributes
        raise 'Invalid attribute' unless [Symbol, String].include?(attr.class)
        _key = attr.to_s
        values[_key] = record.send(_key)
      end
    end
  end
  if call_stack >= 1
    values
  else
    { 'values' => values }.merge(@labels)
  end
end