module Bitmovin
  module ChildCollection
    def self.included(base)
      base.extend(ClassMethods)
    end

    module ClassMethods
      def child_collection(name, path, parameters, klass)
        define_method("load_#{name}") do
          vars = parameters.map { |p| instance_variable_get("@#{p}") }
          url = path % vars
          response = Bitmovin.client.get(url)

          result(response)["items"].map do |item| 
            p = vars + [item]
            klass.new(*p)
          end
        end
        define_method(name) do
          if !persisted?
            raise "#{self.class.name.demodulize} is not persisted yet - can't load #{name}"
          end
          if instance_variable_get("@#{name}").nil?
            items = send("load_#{name}")
            instance_variable_set("@#{name}", items)
          end
          instance_variable_get("@#{name}")
        end

        define_method("build_#{ActiveSupport::Inflector.singularize(name)}") do |hash = {}|
          instance_vars = parameters.map { |p| instance_variable_get("@#{p}") }
          if !persisted?
            raise "Period is not persisted yet - can't create #{ActiveSupport::Inflector.singularize(name)}"
          end
          instance_vars << hash
          klass.new(*instance_vars)
        end
      end
    end
  end
end