require 'chef/resource'

class Chef
  class Resource
    class UlimitDomain < Chef::Resource
      resource_name :ulimit_domain

      property :domain, String
      property :domain_name, String, name_property: true
      property :filename, String

      load_current_value do |new_resource|
        new_resource.filename new_resource.name unless new_resource.filename
        new_resource.filename "#{new_resource.filename}.conf" unless new_resource.filename.end_with?('.conf')

        new_resource.subresource_rules.map! do |name, block|
          urule = Chef::Resource::UlimitRule.new("#{new_resource.name}:#{name}]", nil)
          urule.domain new_resource
          urule.action :nothing
          urule.instance_eval(&block)
          unless name
            urule.name "ulimit_rule[#{new_resource.name}:#{urule.item}-#{urule.type}-#{urule.value}]"
          end
          urule
        end
      end

      attr_reader :subresource_rules

      def initialize(*args)
        @subresource_rules = []
        super
      end

      def rule(name = nil, &block)
        @subresource_rules << [name, block]
      end

      action :create do
        new_resource.subresource_rules.map do |sub_resource|
          sub_resource.run_context = new_resource.run_context
          sub_resource.run_action(:create)
        end

        new_resource.filename new_resource.name unless new_resource.filename
        new_resource.filename "#{new_resource.filename}.conf" unless new_resource.filename.end_with?('.conf')
        template ::File.join(node['ulimit']['security_limits_directory'], new_resource.filename) do
          source 'domain.erb'
          cookbook 'ulimit'
          variables domain: new_resource.domain_name
        end
      end

      action :delete do
        file ::File.join(node['ulimit']['security_limits_directory'], new_resource.filename) do
          action :delete
        end
      end
    end
  end
end
