module BMC::TextHelper
  include ::ActionView::Helpers::NumberHelper
  include ::ActionView::Helpers::SanitizeHelper
  include ::ActionView::Helpers::TextHelper

  def nbsp(text = :no_argument)
    if text == :no_argument
      "\u00A0"
    else
      text.to_s.gsub(" ", nbsp)
    end
  end

  def euros(n)
    currency(n, "€")
  end

  def currency(n, u)
    return if n.nil?

    I18n.t("number.currency.format.format")
      .gsub("%n", number(n))
      .gsub("%u", u)
      .tr(" ", nbsp)
  end

  def percentage(n)
    return if n.nil?

    number(n) + nbsp + "%"
  end

  def number(n)
    return if n.nil?

    opts = {}

    if n.class.to_s.match?(/Float|Decimal/i)
      opts[:precision] = 2
    else
      opts[:precision] = 0
    end

    opts[:delimiter] = I18n.t("number.format.delimiter")
    opts[:separator] = I18n.t("number.format.separator")

    number_with_precision(n, opts).tr(" ", nbsp)
  end

  def date(d, **args)
    I18n.l(d, **args) unless d.nil?
  end

  def boolean_icon(bool)
    return if bool.nil?

    return icon(:check, style: "color: green") if bool == true
    return icon(:times, style: "color: red")   if bool == false

    raise "#{bool} is not a boolean"
  end

  def text2html(str)
    return if str.to_s.blank?

    str = str.delete("\r").strip
    strip_tags(str).gsub("\n", "<br />").html_safe
  end

  def lf2br(str)
    return if str.to_s.blank?

    str.delete("\r").gsub("\n", "<br />").html_safe
  end

  def info( # rubocop:disable Metrics/ParameterLists
    object,
    attribute,
    value: nil,
    default: nil,
    helper: nil,
    tag: :div,
    separator: " : ",
    label: object.t(attribute)
  )
    if default == :hide
      value = fma(object, attribute, value: value, helper: helper)
      return if value.nil?
    end

    value = fma(object, attribute, value: value, default: default, helper: helper)

    separator   = " :<br/>".html_safe if separator == :br
    klass       = object.is_a?(Module) ? object : object.class
    object_type = klass.to_s.split("::").last.underscore

    html_label     = self.tag.strong(class: "info-label") { label }
    span_css_class = "info-value #{object_type}-#{attribute}"
    html_value     = self.tag.span(class: span_css_class) { value }
    separator_html = self.tag.span(class: "info-separator") { separator }

    container_css_class = ["info", ("blank" if value.blank?)]

    content_tag(tag, class: container_css_class) do
      [html_label, separator_html, html_value].sum
    end
  end # def info

  # format model attribute
  def fma(object, attribute, value: nil, default: nil, helper: nil)
    value = object.public_send(attribute) if value.nil?
    value = default if value != false && value.blank?

    i18n_scope = object.model_name.instance_variable_get(:@klass).i18n_scope
    i18n_key = "#{object.model_name.i18n_key}/#{attribute}"
    nested   = I18n.t("#{i18n_scope}.attributes.#{i18n_key}", default: "").is_a?(Hash)

    value = object.tv(attribute) if nested
    value = send(helper, value)  if helper
    value = t("yes")             if value == true
    value = t("no")              if value == false
    value = number(value)        if value.is_a?(Numeric)
    value = date(value)          if value.is_a?(Date) || value.is_a?(Time)

    value.to_s.presence
  end
end