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),
_ => "{}"
}
};
}
}