class Lutaml::Model::Schema::XmlCompiler::Element

def attribute_options

def attribute_options
  [collection_option, default_option].compact.join
end

def collection_option

def collection_option
  return if min_occurs.nil? && max_occurs.nil?
  min_value = min_occurs.nil? ? 1 : min_occurs.to_i
  ", collection: #{min_value}..#{max_value}"
end

def default_option

def default_option
  return if default.nil?
  ", default: -> { #{default.inspect} }"
end

def initialize(name: nil, ref: nil)

def initialize(name: nil, ref: nil)
  @name = name
  @ref = ref
end

def last_of_split(field = ref)

def last_of_split(field = ref)
  field&.split(":")&.last
end

def max_value

def max_value
  return "Float::INFINITY" if max_occurs == "unbounded"
  return 1 if max_occurs.nil?
  max_occurs.to_i
end

def render_default_option

def render_default_option
  return if default.nil?
  ", render_default: true"
end

def required_files

def required_files
  return if skippable?
  element_type = resolved_type(change_case: false)
  return "require \"bigdecimal\"" if element_type == "decimal"
  return if SimpleType.skippable?(element_type)
  "require_relative \"#{Utils.snake_case(element_type)}\""
end

def resolved_instance

def resolved_instance
  @resolved_instance ||= XmlCompiler.instance_variable_get(:@elements)[last_of_split]
end

def resolved_name(change_case: true)

def resolved_name(change_case: true)
  @current_name ||= name || resolved_instance&.name
  change_case ? Utils.snake_case(@current_name) : @current_name
end

def resolved_type(change_case: true)

def resolved_type(change_case: true)
  @current_type ||= type || resolved_instance&.type
  klass_name = last_of_split(@current_type)
  change_case ? Utils.snake_case(klass_name) : klass_name
end

def skippable?

def skippable?
  resolved_name == "schema_location"
end

def to_attributes(indent)

def to_attributes(indent)
  return if skippable?
  return unless resolved_type
  "#{indent}attribute :#{resolved_name}, :#{resolved_type}#{attribute_options}\n"
end

def to_xml_mapping(indent)

def to_xml_mapping(indent)
  return if skippable?
  return unless resolved_type
  "#{indent}map_element :#{resolved_name(change_case: false)}, to: :#{resolved_name}#{render_default_option}\n"
end