module ForemanSalt::Concerns::HostManagedExtensions

def all_salt_modules

def all_salt_modules
  return [] unless salt_environment
  modules = salt_modules + (hostgroup ? hostgroup.all_salt_modules : [])
  ForemanSalt::SaltModule.in_environment(salt_environment).where(id: modules)
end

def autosign_grain_name

def autosign_grain_name
  'autosign_key'
end

def create_salt_autosign

def create_salt_autosign
  Rails.logger.info("Create salt autosign key for host #{fqdn}")
  api = ProxyAPI::Salt.new(url: salt_proxy.url)
  key = generate_provisioning_key
  api.autosign_create_key(key)
  update(salt_autosign_key: key)
  update(salt_status: ForemanSalt::SaltStatus.minion_auth_waiting)
rescue Foreman::Exception => e
  Rails.logger.warn("Unable to create salt autosign for #{fqdn}: #{e}")
end

def derive_salt_grains(use_autosign: false)

def derive_salt_grains(use_autosign: false)
  grains = {}
  begin
    Rails.logger.info('Derive Salt Grains from host_params and autosign_key')
    grains[autosign_grain_name] = salt_autosign_key if use_autosign && !salt_autosign_key.nil?
    unless host_params[host_params_grains_name].nil? ||
           host_params[host_params_grains_name].class != Hash
      grains.merge!(host_params[host_params_grains_name])
    end
  rescue Foreman::Exception => e
    Rails.logger.warn("Unable to derive Salt Grains: #{e}")
  end
  grains
end

def ensure_salt_autosign

def ensure_salt_autosign
  remove_salt_key
  remove_salt_autosign
  create_salt_autosign
end

def generate_provisioning_key

def generate_provisioning_key
  SecureRandom.hex(10)
end

def host_params_grains_name

def host_params_grains_name
  'salt_grains'
end

def remove_salt_autosign

def remove_salt_autosign
  key = salt_autosign_key
  return if key.nil?
  Rails.logger.info("Remove salt autosign key for host #{fqdn}")
  begin
    api = ProxyAPI::Salt.new(url: salt_proxy.url)
    api.autosign_remove_key(key)
  rescue Foreman::Exception => e
    Rails.logger.warn("Unable to remove salt autosign for #{fqdn}: #{e}")
  end
end

def remove_salt_key

def remove_salt_key
  Rails.logger.info("Remove salt key for host #{fqdn}")
  api = ProxyAPI::Salt.new(url: salt_proxy.url)
  api.key_delete(name)
end

def remove_salt_minion

def remove_salt_minion
  remove_salt_autosign
  remove_salt_key
end

def salt_master

def salt_master
  salt_proxy.to_s
end

def salt_modules_for_enc

def salt_modules_for_enc
  all_salt_modules.collect(&:name).uniq
end

def salt_modules_in_host_environment

def salt_modules_in_host_environment
  return unless salt_modules.any?
  if salt_environment
    errors.add(:base, _('Salt states must be in the environment of the host')) unless (salt_modules - salt_environment.salt_modules).empty?
  else
    errors.add(:base, _('Host must have an environment in order to set salt states'))
  end
end

def salt_params

def salt_params
  variables = ForemanSalt::SaltVariable.where(salt_module_id: all_salt_modules.pluck(:id), override: true)
  values = variables.values_hash(self)
  variables.each_with_object({}) do |var, memo|
    value = values[var]
    memo[var.key] = value if value
    memo
  end
end