module ForemanOpenscap::ComplianceStatusScopedSearch::ClassMethods

def apply_condition(scope, negate, conditions)

def apply_condition(scope, negate, conditions)
  if negate
    scope.where.not(conditions)
  else
    scope.where(conditions)
  end
end

def policy_search(search_alias)

def policy_search(search_alias)
  scoped_search :relation => :policy, :on => :name, :complete_value => true, :rename => search_alias,
        :only_explicit => true
end

def query_conditions(query)

def query_conditions(query)
  { :conditions => "reports.id IN (#{query})" }
end

def query_conditions_from_scope(scope)

def query_conditions_from_scope(scope)
  query = scope.select(ArfReport.arel_table[:id]).to_sql
  query_conditions query
end

def search_by_compliance_status(key, operator, value)

def search_by_compliance_status(key, operator, value)
  scope = case value
          when 'compliant'
            ArfReport.passed
          when 'incompliant'
            ArfReport.failed
          when 'inconclusive'
            ArfReport.othered
          end
  query_conditions_from_scope scope
end

def search_by_comply_with(_key, _operator, policy_name)

def search_by_comply_with(_key, _operator, policy_name)
  search_by_policy_results policy_name, &:passed
end

def search_by_host_collection_name(key, operator, value)

def search_by_host_collection_name(key, operator, value)
  scope = apply_condition(::Host.joins(:host_collections),
                          operator == '<>',
                          :katello_host_collections => { :name => value })
  query_conditions_from_scope ForemanOpenscap::ArfReport.where(:host_id => scope)
end

def search_by_inconclusive_with(_key, _operator, policy_name)

def search_by_inconclusive_with(_key, _operator, policy_name)
  search_by_policy_results policy_name, &:othered
end

def search_by_last_for(key, operator, by)

def search_by_last_for(key, operator, by)
  by.gsub!(/[^[:alnum:]]/, '')
  case by.downcase
  when 'host'
    { :conditions => "reports.id IN (
          SELECT MAX(id) FROM reports sub
          WHERE sub.type = 'ForemanOpenscap::ArfReport'
            AND sub.host_id = reports.host_id )" }
  when 'policy'
    { :conditions => 'reports.id IN (
        SELECT latest.id
        FROM foreman_openscap_policies
          INNER JOIN (SELECT policy_id, MAX(reports.id) AS id
                      FROM reports INNER JOIN foreman_openscap_policy_arf_reports
                        ON reports.id = foreman_openscap_policy_arf_reports.arf_report_id
                      GROUP BY policy_id
                     ) latest
          ON foreman_openscap_policies.id = latest.policy_id)' }
  else
    raise "Cannot search last by #{by}"
  end
end

def search_by_not_comply_with(_key, _operator, policy_name)

def search_by_not_comply_with(_key, _operator, policy_name)
  search_by_policy_results policy_name, &:failed
end

def search_by_policy_results(policy_name, &selection)

def search_by_policy_results(policy_name, &selection)
  scope = ArfReport.of_policy(Policy.find_by(:name => policy_name).id)
                   .instance_eval(&selection)
  query_conditions_from_scope scope
end

def search_by_rule(rule_name, rule_result)

def search_by_rule(rule_name, rule_result)
  query = ArfReport.by_rule_result(rule_name, rule_result)
                   .select(ArfReport.arel_table[:id]).to_sql
  query_conditions query
end

def search_by_rule_failed(key, operator, rule_name)

def search_by_rule_failed(key, operator, rule_name)
  search_by_rule rule_name, "fail"
end

def search_by_rule_othered(key, operator, rule_name)

def search_by_rule_othered(key, operator, rule_name)
  search_by_rule rule_name, LogExtensions.othered_result_constants
end

def search_by_rule_passed(key, operator, rule_name)

def search_by_rule_passed(key, operator, rule_name)
  search_by_rule rule_name, "pass"
end