module WolfCore::FriendlyModelId

def by_friendly_id(friendly_id)

def by_friendly_id(friendly_id)
  find_by(friendly_id: friendly_id)
end

def convert_candidate_to_friendly_id(candidate)

def convert_candidate_to_friendly_id(candidate)
  candidate = Array(candidate)
  candidate.map!(&:to_sym).uniq!
  candidate.map do |field|
    field_value = send(field)
    parse_field_value(field_value)
  end.join("-")
end

def find_unique_friendly_id

def find_unique_friendly_id
  friendly_id_candidates_array.each do |candidate|
    friendly_id = convert_candidate_to_friendly_id(candidate)
    return friendly_id if friendly_id.present? && !friendly_id_used?(friendly_id)
  end
  nil
end

def friendly_id_candidates

def friendly_id_candidates
  [:id]
end

def friendly_id_candidates_array

def friendly_id_candidates_array
  Array(friendly_id_candidates)
end

def friendly_id_used?(friendly_id)

def friendly_id_used?(friendly_id)
  self.class.where.not(id: id).find_by(friendly_id: friendly_id).present?
end

def generate_friendly_id

def generate_friendly_id
  friendly_id = find_unique_friendly_id
  return friendly_id if friendly_id.present?
  default_candidate = Array(friendly_id_candidates_array.first) + [:id]
  convert_candidate_to_friendly_id(default_candidate)
end

def parse_field_value(field_value)

def parse_field_value(field_value)
  field_value = to_kebab_case(field_value)
  remove_non_alphanumeric_chars(field_value, exceptions: "-")
end

def set_friendly_id

def set_friendly_id
  return if friendly_id.present?
  self.friendly_id = generate_friendly_id
end