Editor/Layers/ArchLayerNames.cs
namespace Sunless.Architecture;

public static class ArchLayerNames {
	public static string DisplayName( ArchLayerNode node ) {
		if ( node is null ) {
			return "";
		}

		return ArchKindsAsked.DisplayName( node.Kind, node.Payload ) ?? SeparateIdentifier( node.Name ?? "" );
	}

	static string SeparateIdentifier( string value ) {
		var result = "";

		for ( var index = 0; index < value.Length; index++ ) {
			var character = value[index];
			var previous = index > 0 ? value[index - 1] : '\0';
			var separates = index > 0 && character != '_' && previous != '_'
				&& (char.IsDigit( character ) && !char.IsDigit( previous )
					|| !char.IsDigit( character ) && char.IsDigit( previous )
					|| char.IsUpper( character ) && char.IsLower( previous ));

			if ( character == '_' ) {
				if ( result.Length > 0 && result[^1] != ' ' ) {
					result += ' ';
				}

				continue;
			}

			if ( separates ) {
				result += ' ';
			}

			result += character;
		}

		return result.Trim();
	}
}