module JSONAPI::TypeConversion

def format_type_name(full_name, format)

def format_type_name(full_name, format)
  case format
  when :prefixed
    full_name
  when :underscore
    full_name.tr("/", "_")
  else # :flat
    full_name.split("/").last
  end
end

def model_type_name(model_class, format: nil)

def model_type_name(model_class, format: nil)
  format ||= JSONAPI.configuration.namespace_type_format
  full_name = model_class.name.underscore.pluralize
  format_type_name(full_name, format)
end

def prefixed_type_to_class(type_str)

def prefixed_type_to_class(type_str)
  parts = type_str.split("/")
  "#{parts[0..-2].join("/").camelize}::#{parts.last.singularize.classify}"
end

def resolve_type_format(definition_class)

def resolve_type_format(definition_class)
  if definition_class.respond_to?(:type_format) && definition_class.type_format
    definition_class.type_format
  else
    JSONAPI.configuration.namespace_type_format
  end
end

def resource_type_name(definition_class, format: nil)

def resource_type_name(definition_class, format: nil)
  format ||= resolve_type_format(definition_class)
  full_name = definition_class.name.sub(/Resource$/, "").underscore.pluralize
  format_type_name(full_name, format)
end

def type_to_class_name(type, namespace: nil)

def type_to_class_name(type, namespace: nil)
  type_str = type.to_s
  return prefixed_type_to_class(type_str) if type_str.include?("/")
  return "#{namespace.to_s.camelize}::#{type_str.singularize.classify}" if namespace.present?
  type_str.singularize.classify
end