using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
///
/// In-app scenario catalogue and run control for clinical testing sessions.
///
[ApiController]
[Route("api/v1/simulation")]
[Produces("application/json")]
[Authorize]
public class SimulationController : ControllerBase
{
private readonly SimulationOptions _options;
private readonly ISimulationRunner? _runner;
private readonly IScenarioCatalog? _catalog;
private readonly ICurrentUserService _currentUser;
private readonly IAuditService _audit;
public SimulationController(
IOptions options,
IServiceProvider services,
ICurrentUserService currentUser,
IAuditService audit)
{
_options = options.Value;
_runner = services.GetService();
_catalog = services.GetService();
_currentUser = currentUser;
_audit = audit;
}
///
/// Feature-detect simulation availability without requiring simulation:run.
/// Returns enabled=false when the feature is off (never 404).
///
[HttpGet("config")]
[AuthorizePermission(ClinicalPermissions.AlertsRead)]
[ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
public IActionResult GetConfig()
{
if (!_options.Enabled)
return Ok(ApiResponse.Ok(new SimulationConfigResponse(Enabled: false)));
return Ok(ApiResponse.Ok(new SimulationConfigResponse(
Enabled: true,
MaxSpeed: _options.MaxSpeed,
MaxConcurrentRuns: _options.MaxConcurrentRuns)));
}
///
/// Lists available scenario files from the configured scenario directory.
///
[HttpGet("scenarios")]
[AuthorizePermission(ClinicalPermissions.SimulationRun)]
[ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ApiResponse