module Cloudster
 #ElastiCache Resource
 class ElastiCache

   attr_accessor :name, :template
   # Initializes an ElastiCache resource
   #
   # ==== Notes
   # options parameter must include values for :node_type, :cache_security_group_names, :engine, :node_count
   #
   # ==== Parameters
   # * options<~Hash>
   #   * :name : String representing the name for the ElastiCache resource (Required)
   #   * :node_type : String representing the compute and memory capacity of nodes in a Cache Cluster. One of : cache.t1.micro | cache.m1.small | cache.m1.medium | cache.m1.large | cache.m1.xlarge | cache.m3.xlarge | cache.m3.2xlarge | cache.m2.xlarge | cache.m2.2xlarge | cache.m2.4xlarge | cache.c1.xlarge (Required)
   #   * :cache_security_group_names : Array of cache security group names (Required)
   #   * :engine : String containing the name of the cache engine to be used for this cache cluster. Only 'memcached' is supported now.(Required)
   #   * :node_count : Integer indicating number of cache nodes the cache cluster should have.(Required)
   # ==== Examples
   #   cache = Cloudster::ElastiCache.new(
   #    :name => 'ElastiCacheResource',
   #    :node_type => 'cache.t1.micro',
   #    :cache_security_group_names => ['default'],
   #    :engine => 'memcached',
   #    :node_count => 3
   #   )

   def initialize(options = {})
     require_options(options, [:name, :node_type, :cache_security_group_names, :engine, :node_count])
     @name = options[:name]
     @node_type = options[:node_type]
     @cache_security_group_names = options[:cache_security_group_names]
     @engine = options[:engine]
     @node_count = options[:node_count]
   end

   # Returns a Ruby hash version of the Cloud Formation template for the ElastiCache resource
   #
   # ==== Examples
   #   elasticache = Cloudster::ElastiCache.new(
   #    :name => 'ElastiCacheResource',
   #    :node_type => 'cache.t1.micro',
   #    :cache_security_group_names => ['default'],
   #    :engine => 'memcached',
   #    :node_count => 3
   #   )
   #   elasticache.template
   #
   # ==== Returns
   # * Ruby hash version of the Cloud Formation template for the elasticache resource
    def template
      @template ||= ElastiCache.template({:name => @name, :node_type => @node_type, :cache_security_group_names => @cache_security_group_names, :engine => @engine, :node_count => @node_count})
    end

    # Class method that returns a Ruby hash version of the Cloud Formation template
    #
    # ==== Examples
    #   template = Cloudster::ElastiCache.template(
    #     :name => 'ElastiCacheResource',
    #     :node_type => 'cache.t1.micro',
    #     :cache_security_group_names => ['default'],
    #     :engine => 'memcached',
    #     :node_count => 3"
    #   )
    #
    # ==== Parameters
    # * options<~Hash>
    #   * :name : String representing the name for the ElastiCache resource (Required)
   #   * :node_type : String representing the compute and memory capacity of nodes in a Cache Cluster. One of : cache.t1.micro | cache.m1.small | cache.m1.medium | cache.m1.large | cache.m1.xlarge | cache.m3.xlarge | cache.m3.2xlarge | cache.m2.xlarge | cache.m2.2xlarge | cache.m2.4xlarge | cache.c1.xlarge (Required)
    #   * :cache_security_group_names : Array of cache security group names (Required)
    #   * :engine : String containing the name of the cache engine to be used for this cache cluster. Only 'memcached' is supported now.(Required)
    #   * :node_count : Integer indicating number of cache nodes the cache cluster should have.(Required)
    # ==== Returns
    # * Ruby hash version of the Cloud Formation template for ElastiCache
    def self.template(options = {})
      require_options(options, [:name, :node_type, :cache_security_group_names, :engine, :node_count])
      properties = {}
      properties.merge!({
        "CacheNodeType" => options[:node_type],
        "CacheSecurityGroupNames" => options[:cache_security_group_names],
        "Engine" => options[:engine],
        "NumCacheNodes" => options[:node_count].to_s
      })
      template = {'Resources' => {
                        options[:name] => {
                          'Type' => 'AWS::ElastiCache::CacheCluster',
                          'Properties' => properties
                       }
                  }
      }
      return template
    end
 end
end
