class Lutaml::Model::Schema::XmlCompiler::SimpleType

def down_union_class_name(union)

def down_union_class_name(union)
  Utils.snake_case(last_of_split(union))
end

def extended_indent

def extended_indent
  (@indent || "  ") * 2
end

def initialize(name, unions = [])

def initialize(name, unions = [])
  @class_name = name
  @unions = unions
end

def klass_name

def klass_name
  @klass_name ||= Utils.camel_case(class_name)
end

def last_of_split(field)

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

def parent_class

def parent_class
  type_info = SUPPORTED_DATA_TYPES[base_class&.to_sym]
  return type_info[:class_name] if type_info&.dig(:skippable)
  return Utils.camel_case(base_class.to_s) if !!!type_info&.dig(:skippable) && Utils.present?(base_class)
  LUTAML_VALUE_CLASS_NAME
end

def require_parent?

def require_parent?
  return false if Utils.blank?(base_class)
  !!!SUPPORTED_DATA_TYPES[base_class&.to_sym]&.dig(:skippable)
end

def required_files

def required_files
  files = Array(instance&.required_files)
  files << "require_relative \"#{Utils.snake_case(parent_class)}\"" if require_parent?
  files.join("\n")
end

def setup_options(options)

def setup_options(options)
  @indent = " " * options&.fetch(:indent, 2)
end

def setup_restriction(base_class, validations)

def setup_restriction(base_class, validations)
  return unless validations
  Restriction.new.tap do |restriction|
    restriction.base_class = base_class
    restriction.min_inclusive = validations[:min_inclusive]
    restriction.max_inclusive = validations[:max_inclusive]
    restriction.pattern = validations[:pattern]
    restriction.transform = validations[:transform]
  end
end

def setup_supported_types

def setup_supported_types
  SUPPORTED_DATA_TYPES
    .reject { |_, simple_type| simple_type[:skippable] }
    .each_with_object({}) do |(name, simple_type), hash|
    str_name = name.to_s
    new(str_name).tap do |instance|
      instance.base_class = Utils.base_class_snake_case(simple_type[:class_name])
      instance.instance = setup_restriction(instance.base_class, simple_type[:validations])
      hash[str_name] = instance
    end
  end
end

def skippable?(type)

def skippable?(type)
  SUPPORTED_DATA_TYPES.dig(type&.to_sym, :skippable)
end

def to_class(options: {})

def to_class(options: {})
  setup_options(options)
  template = unions&.any? ? UNION_MODEL_TEMPLATE : INSTANCE_MODEL_TEMPLATE
  template.result(binding)
end

def union_class_method_body

def union_class_method_body
  unions.map do |union|
    "#{extended_indent}register.get_class(:#{down_union_class_name(union)}).cast(value, options)"
  end.join(" ||\n  ")
end

def union_required_files

def union_required_files
  unions.filter_map do |union|
    next if SUPPORTED_DATA_TYPES.dig(last_of_split(union).to_sym, :skippable)
    "require_relative \"#{down_union_class_name(union)}\""
  end.join("\n")
end