using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
namespace AIStudio.Assistants.VisualBriefing;
///
/// Compiles interaction state and safe declarative controls.
///
internal static class VisualBriefingInteractionCompiler
{
///
/// Compiles controls and formulas into deterministic runtime state.
///
/// The validated interaction controls.
/// The validated formula specifications.
/// The declarative interaction data.
internal static JsonElement Compile(IReadOnlyList controls, IReadOnlyList formulas)
{
var state = controls.ToDictionary(
control => control.ControlId,
control => control.InitialValue.Clone(),
StringComparer.Ordinal);
var formulaMap = formulas.ToDictionary(
formula => formula.OutputSlotId,
formula => formula.Formula,
StringComparer.Ordinal);
return JsonSerializer.SerializeToElement(new
{
controls,
state,
formulas = formulaMap,
}, VisualBriefingJson.Canonical);
}
///
/// Compiles safe control markup for one component.
///
/// The owning component identifier.
/// All validated briefing controls.
/// The declarative control markup.
internal static string CompileMarkup(string componentId, IReadOnlyList controls)
{
var builder = new StringBuilder();
foreach (var indexed in controls.Select((control, index) => (Control: control, Index: index)).Where(item => item.Control.ComponentId == componentId))
{
var control = indexed.Control;
var id = HtmlEncoder.Default.Encode(control.ControlId);
var accessibilityPath = $"accessibility.{HtmlEncoder.Default.Encode(componentId)}";
builder.Append(control.Kind switch
{
VisualBriefingControlKind.SELECT or VisualBriefingControlKind.FILTER => $"",
VisualBriefingControlKind.RANGE => $"",
VisualBriefingControlKind.NUMBER => $"",
_ => string.Empty,
});
}
return builder.ToString();
}
///
/// Compiles a deterministic reset action for one simulation component.
///
/// The simulation component identifier.
/// The declarative reset button markup.
internal static string CompileResetMarkup(string componentId) => $"";
}