class Playbook::PbIcon::Icon

def asset_path

def asset_path
  return unless Rails.application.config.respond_to?(:icon_path)
  base_path = Rails.application.config.icon_path
  icon_path = Dir.glob(Rails.root.join(base_path, "**", "#{icon}.svg")).first
  icon_path if icon_path && File.exist?(icon_path)
end

def border_class

def border_class
  border ? "fa-border" : nil
end

def classname

def classname
  generate_classname(
    "pb_icon_kit",
    font_style_class,
    icon_class,
    border_class,
    fixed_width_class,
    flip_class,
    inverse_class,
    list_item_class,
    pull_class,
    pulse_class,
    rotation_class,
    size_class,
    spin_class,
    separator: " "
  )
end

def custom_icon_classname

def custom_icon_classname
  generate_classname(
    "pb_icon_kit",
    border_class,
    fixed_width_class,
    flip_class,
    inverse_class,
    list_item_class,
    pull_class,
    pulse_class,
    rotation_class,
    size_class,
    spin_class,
    separator: " "
  )
end

def fixed_width_class

def fixed_width_class
  fixed_width ? "fa-fw" : nil
end

def flip_class

def flip_class
  case flip
  when "horizontal"
    "fa-flip-horizontal"
  when "vertical"
    "fa-flip-vertical"
  when "both"
    "fa-flip-horizontal fa-flip-vertical"
  end
end

def font_style_class

def font_style_class
  font_style ? font_style.to_s : "far"
end

def icon_class

def icon_class
  icon ? "fa-#{icon}" : nil
end

def inverse_class

def inverse_class
  inverse ? "fa-inverse" : nil
end

def is_svg?

def is_svg?
  (icon || custom_icon.to_s).include?(".svg") || asset_path.present?
end

def list_item_class

def list_item_class
  list_item ? "fa-li" : nil
end

def pull_class

def pull_class
  pull ? "fa-pull-#{pull}" : nil
end

def pulse_class

def pulse_class
  pulse ? "fa-pulse" : nil
end

def render_svg

def render_svg
  doc = Nokogiri::XML(URI.open(asset_path || icon || custom_icon)) # rubocop:disable Security/Open
  svg = doc.at_css "svg"
  svg["class"] = %w[pb_custom_icon svg-inline--fa].concat([object.custom_icon_classname]).join(" ")
  svg["id"] = object.id
  svg["data"] = object.data
  svg["aria"] = object.aria
  svg["height"] = "auto"
  svg["width"] = "auto"
  doc.at_css("path")["fill"] = "currentColor"
  raw doc
end

def rotation_class

def rotation_class
  rotation ? "fa-rotate-#{rotation}" : nil
end

def size_class

def size_class
  size ? "fa-#{size}" : nil
end

def spin_class

def spin_class
  spin ? "fa-spin" : nil
end

def svg_size

def svg_size
  size.nil? ? "1x" : size
end

def valid_emoji?

def valid_emoji?
  emoji_regex = /\p{Emoji}/
  emoji_regex.match?(icon)
end