using System.Text.Json; using RobotNet10.NavigationTune.Shared.Models; using StraightLineScenario = RobotNet10.NavigationTune.Scenarios.StraightLineScenario; using CircleScenario = RobotNet10.NavigationTune.Scenarios.CircleScenario; using CustomPathScenario = RobotNet10.NavigationTune.Scenarios.CustomPathScenario; namespace RobotNet10.NavigationTune.Data; /// /// Entity for storing TestScenario in database /// Since TestScenario is abstract, we store config as JSON /// public class TestScenarioEntity { public Guid Id { get; set; } public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public TrajectoryType Type { get; set; } public DateTime CreatedAt { get; set; } public bool IsDefault { get; set; } /// /// JSON config for scenario-specific properties /// public string ConfigJson { get; set; } = string.Empty; /// /// Convert to TestScenario instance /// public TestScenario ToTestScenario() { return Type switch { TrajectoryType.StraightLine => JsonSerializer.Deserialize(ConfigJson) ?? new StraightLineScenario { Id = Id, Name = Name, Description = Description, Type = Type, CreatedAt = CreatedAt, IsDefault = IsDefault }, TrajectoryType.Circle => JsonSerializer.Deserialize(ConfigJson) ?? new CircleScenario { Id = Id, Name = Name, Description = Description, Type = Type, CreatedAt = CreatedAt, IsDefault = IsDefault }, TrajectoryType.Custom => JsonSerializer.Deserialize(ConfigJson) ?? new CustomPathScenario { Id = Id, Name = Name, Description = Description, Type = Type, CreatedAt = CreatedAt, IsDefault = IsDefault }, _ => throw new NotSupportedException($"Scenario type {Type} is not supported") }; } /// /// Create from TestScenario /// public static TestScenarioEntity FromTestScenario(TestScenario scenario) { return new TestScenarioEntity { Id = scenario.Id, Name = scenario.Name, Description = scenario.Description, Type = scenario.Type, CreatedAt = scenario.CreatedAt, IsDefault = scenario.IsDefault, ConfigJson = scenario.Type switch { TrajectoryType.StraightLine => JsonSerializer.Serialize((StraightLineScenario)scenario), TrajectoryType.Circle => JsonSerializer.Serialize((CircleScenario)scenario), TrajectoryType.Custom => JsonSerializer.Serialize((CustomPathScenario)scenario), _ => "{}" } }; } }