Editor/CodeDialog/CodeDialogEditBuffer.cs
using System.Collections.Generic;
using System.Linq;
using Grains.RazorDesigner.Wiring;

namespace Grains.RazorDesigner.CodeDialog;

public sealed class CodeDialogEditBuffer
{
    public List<StateSymbol> States { get; }
    public List<ParameterSymbol> Parameters { get; }
    public IReadOnlyList<Symbol> OtherSymbols { get; }

    public string Namespace { get; set; }
    public string ClassName { get; set; }
    public string BaseClass { get; set; }
    public IReadOnlyList<string> Usings { get; set; }

    public CodeDialogEditBuffer( WiringEnvelope source )
    {
        States = new List<StateSymbol>(
            source.Symbols.OfType<StateSymbol>() );
        Parameters = new List<ParameterSymbol>(
            source.Symbols.OfType<ParameterSymbol>() );
        OtherSymbols = source.Symbols
            .Where( s => s is not StateSymbol and not ParameterSymbol )
            .ToArray();
        Namespace = source.Namespace;
        ClassName = source.ClassName;
        BaseClass = source.BaseClass;
        Usings = source.Usings;
    }

    public WiringEnvelope ToEnvelope()
    {
        var symbols = new List<Symbol>( Parameters.Count + States.Count + OtherSymbols.Count );
        symbols.AddRange( Parameters );
        symbols.AddRange( States );
        symbols.AddRange( OtherSymbols );

        return new WiringEnvelope
        {
            Namespace = Namespace ?? "",
            ClassName = ClassName ?? "",
            BaseClass = string.IsNullOrEmpty( BaseClass ) ? "PanelComponent" : BaseClass,
            Symbols = symbols,
            Usings = Usings ?? System.Array.Empty<string>(),
        };
    }
}