module Chef::Provider::Package::Deb

def self.included(base)

def self.included(base)
  base.class_eval do
    use_multipackage_api
    action :reconfig do
      if current_resource.version.nil?
        logger.debug("#{new_resource} is NOT installed - nothing to do")
        return
      end
      unless new_resource.response_file
        logger.debug("#{new_resource} no response_file provided - nothing to do")
        return
      end
      if preseed_file = get_preseed_file(new_resource.package_name, current_resource.version)
        converge_by("reconfigure package #{new_resource.package_name}") do
          preseed_package(preseed_file)
          multipackage_api_adapter(new_resource.package_name, current_resource.version) do |name, _version|
            reconfig_package(name)
          end
          logger.info("#{new_resource} reconfigured")
        end
      else
        logger.debug("#{new_resource} preseeding has not changed - nothing to do")
      end
    end
    # This method is used for getting preseed file
    # it will return preseed file path or false if response_file is present
    def prepare_for_installation
      if new_resource.response_file && preseed_file = get_preseed_file(package_names_for_targets, versions_for_targets)
        converge_by("preseed package #{package_names_for_targets}") do
          preseed_package(preseed_file)
        end
      end
    end
    def get_preseed_file(name, version)
      resource = preseed_resource(name, version)
      resource.run_action(:create)
      logger.trace("#{new_resource} fetched preseed file to #{resource.path}")
      if resource.updated_by_last_action?
        resource.path
      else
        false
      end
    end
    def preseed_resource(name, version)
      # A directory in our cache to store this cookbook's preseed files in
      file_cache_dir = Chef::FileCache.create_cache_path("preseed/#{new_resource.cookbook_name}")
      # The full path where the preseed file will be stored
      cache_seed_to = "#{file_cache_dir}/#{name}-#{version}.seed"
      logger.trace("#{new_resource} fetching preseed file to #{cache_seed_to}")
      if template_available?(new_resource.response_file)
        logger.trace("#{new_resource} fetching preseed file via Template")
        remote_file = Chef::Resource::Template.new(cache_seed_to, run_context)
        remote_file.variables(new_resource.response_file_variables)
      elsif cookbook_file_available?(new_resource.response_file)
        logger.trace("#{new_resource} fetching preseed file via cookbook_file")
        remote_file = Chef::Resource::CookbookFile.new(cache_seed_to, run_context)
      else
        message = "No template or cookbook file found for response file #{new_resource.response_file}"
        raise Chef::Exceptions::FileNotFound, message
      end
      remote_file.cookbook_name = new_resource.cookbook_name
      remote_file.source(new_resource.response_file)
      remote_file.backup(false)
      remote_file
    end
    def preseed_package(preseed_file)
      logger.info("#{new_resource} pre-seeding package installation instructions")
      run_noninteractive("debconf-set-selections", preseed_file)
    end
    def reconfig_package(name)
      logger.info("#{new_resource} reconfiguring")
      run_noninteractive("dpkg-reconfigure", *name)
    end
    # Runs command via shell_out with magic environment to disable
    # interactive prompts.
    def run_noninteractive(*command)
      shell_out!(*command, env: { "DEBIAN_FRONTEND" => "noninteractive" })
    end
    private
    def template_available?(path)
      run_context.has_template_in_cookbook?(new_resource.cookbook_name, path)
    end
    def cookbook_file_available?(path)
      run_context.has_cookbook_file_in_cookbook?(new_resource.cookbook_name, path)
    end
  end
end