# frozen_string_literal: true module Playbook module PbCurrency class Currency < Playbook::KitBase prop :align, type: Playbook::Props::Enum, values: %w[left center right], default: "left" prop :size, type: Playbook::Props::Enum, values: %w[lg md sm], default: "md" prop :label, type: Playbook::Props::String, default: "" prop :symbol, type: Playbook::Props::String, default: "$" prop :amount, type: Playbook::Props::String, required: true prop :unit, type: Playbook::Props::String, required: false prop :emphasized, type: Playbook::Props::Boolean, default: true prop :variant, type: Playbook::Props::Enum, values: %w[default light bold], default: "default" prop :dark, type: Playbook::Props::Boolean, default: false prop :abbreviate, type: Playbook::Props::Boolean, default: false prop :decimals, type: Playbook::Props::Enum, values: %w[default matching], default: "default" prop :unstyled, type: Playbook::Props::Boolean, default: false prop :comma_separator, type: Playbook::Props::Boolean, default: false def classname generate_classname("pb_currency_kit", align, size, dark_class) end def currency_wrapper_props { classname: "dollar_sign", color: "light", dark: dark, } end def caption_props { text: label, dark: dark, } end def title_props { size: size_value, text: swap_negative ? absolute_amount(abbr_or_format_amount) : abbr_or_format_amount, classname: "pb_currency_value", dark: dark, } end def abbr_or_format_amount abbreviate ? abbreviated_value : formatted_amount end def negative_sign amount.starts_with?("-") && swap_negative ? "-" : "" end def body_props { text: units_element, color: "light", classname: "unit", dark: dark, } end def emphasized_class emphasized ? "" : "_deemphasized" end def variant_class case variant when "light" "_light" when "bold" "_bold" end end private def whole_value value = amount.split(".").first if comma_separator number_with_delimiter(value.gsub(",", "")) else value end end def decimal_value amount.split(".")[1] || "00" end def units_element return "" if decimals == "matching" && !abbreviate && !unit if unit.nil? && !abbreviate if decimals == "matching" "" else ".#{decimal_value}" end else abbreviate ? "#{abbreviated_value(-1)}#{unit}" : unit end end def abbreviated_value(index = 0..-2) value = amount.split(".").first.gsub(",", "").to_i abbreviated_num = number_to_human(value, units: { thousand: "K", million: "M", billion: "B", trillion: "T" }).gsub(/\s+/, "") abbreviated_num[index] end def size_value case size when "lg" 1 when "md" 3 else 4 end end def dark_class dark ? "dark" : nil end def formatted_amount return abbreviated_value if abbreviate if decimals == "matching" if comma_separator number_with_delimiter(amount.gsub(",", "")) else amount end else whole_value end end def absolute_amount(amount_string) amount_string.sub(/^-/, "") end def swap_negative size == "sm" && symbol != "" end end end end