Code/TailBox/Application/TailBoxScssRenderer.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace Sandbox.TailBox;

internal static class TailBoxScssRenderer
{
	public static string Render( IReadOnlyCollection<TailBoxUtilityRule> rules, TailBoxConfig config, int scannedFileCount )
	{
		var builder = new StringBuilder();
		builder.AppendLine( "/* <auto-generated>" );
		builder.AppendLine( "   tailw& generated utilities. Do not edit by hand." );
		builder.AppendLine( $"   Source files scanned: {scannedFileCount}" );
		builder.AppendLine( $"   Config: {GetFileName( config.ConfigPath ?? TailBoxConfig.FileName )}" );
		builder.AppendLine( "   </auto-generated> */" );
		builder.AppendLine();

		foreach ( var rule in rules )
		{
			AppendRule( builder, rule );
		}

		return builder.ToString();
	}

	private static void AppendRule( StringBuilder builder, TailBoxUtilityRule rule )
	{
		builder.Append( rule.Selector ).AppendLine( " {" );

		foreach ( var declaration in rule.Declarations )
		{
			builder.Append( '\t' )
				.Append( declaration.Property )
				.Append( ": " )
				.Append( declaration.Value );

			if ( declaration.Important )
				builder.Append( " !important" );

			builder.AppendLine( ";" );
		}

		builder.AppendLine( "}" );
	}

	private static string GetFileName( string path )
	{
		if ( string.IsNullOrWhiteSpace( path ) )
			return "";

		var normalized = path.Replace( '\\', '/' );
		var slash = normalized.LastIndexOf( "/", StringComparison.Ordinal );
		return slash >= 0 ? normalized[(slash + 1)..] : normalized;
	}
}