class ApplicationSerializer
  include Rails.application.routes.url_helpers

  class CollectionSerializer < ApplicationSerializer

    def initialize(items, serializer, opts = {})
      super(items, opts)
      @collection_name = opts[:collection_name]
      @serializer = serializer
    end

    def serialize
      list = @item.map { |i| @serializer.for(i).serialize }

      if @collection_name && item.respond_to?(:total_pages)
        {
            total_count: item.total_count,
            total_pages: item.total_pages,
            current_page: item.current_page,
            page_size: item.limit_value,
            @collection_name.to_sym => list
        }
      else
        list
      end
    end
  end

  def self.for(data, opts = {})
    if data.respond_to?(:each)
      CollectionSerializer.new(data, self, opts)
    else
      new(data)
    end
  end

  attr_reader :item

  def initialize(item, opts = {})
    @item = item
    @options = opts
  end

  def item_properties(*keys)
    Hash[keys.map { |k| [k.to_sym, @item.send(k.to_sym)] }]
  end

  def serialize
    @item.as_json
  end

  def as_json(*args)
    serialize
  end

  def to_json(*args)
    Rails.cache.fetch(@item.cache_key, version: @item.cache_version) do
      self.as_json(*args).to_json
    end
  end
end
