using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using RobotNet10.NavigationTune.Shared.Interfaces; using RobotNet10.NavigationTune.Shared.Models; namespace RobotNet10.NavigationTune.Controllers; /// /// REST API controller for parameter sets management /// [ApiController] [Route("api/[controller]")] public class ParameterSetsController( IParameterManager parameterManager, ILogger logger) : ControllerBase { /// /// Get all parameter sets /// [HttpGet] public async Task>> GetAll() { try { var parameterSets = await parameterManager.GetAllAsync(); return Ok(parameterSets); } catch (Exception ex) { logger.LogError(ex, "Error getting all parameter sets"); return StatusCode(500, new { error = "Failed to retrieve parameter sets" }); } } /// /// Get parameter set by ID /// [HttpGet("{id:guid}")] public async Task> GetById(Guid id) { try { var parameterSet = await parameterManager.GetByIdAsync(id); if (parameterSet == null) return NotFound(new { error = $"Parameter set with ID {id} not found" }); return Ok(parameterSet); } catch (Exception ex) { logger.LogError(ex, "Error getting parameter set {Id}", id); return StatusCode(500, new { error = "Failed to retrieve parameter set" }); } } /// /// Get parameter set by name /// [HttpGet("name/{name}")] public async Task> GetByName(string name) { try { var parameterSet = await parameterManager.GetByNameAsync(name); if (parameterSet == null) return NotFound(new { error = $"Parameter set with name '{name}' not found" }); return Ok(parameterSet); } catch (Exception ex) { logger.LogError(ex, "Error getting parameter set {Name}", name); return StatusCode(500, new { error = "Failed to retrieve parameter set" }); } } /// /// Create new parameter set /// [HttpPost] public async Task> Create([FromBody] NavigationParameterSet parameterSet) { try { // Validate if(await parameterManager.GetByNameAsync(parameterSet.Name) is not null) return StatusCode(500, new { error = "Paramter name is existed" }); var validation = parameterManager.Validate(parameterSet); if (!validation.IsValid) { return BadRequest(new { error = "Validation failed", errors = validation.Errors, warnings = validation.Warnings }); } var id = await parameterManager.SaveAsync(parameterSet); var created = await parameterManager.GetByIdAsync(id); return CreatedAtAction(nameof(GetById), new { id }, created); } catch (Exception ex) { logger.LogError(ex, "Error creating parameter set"); return StatusCode(500, new { error = "Failed to create parameter set" }); } } /// /// Update existing parameter set /// [HttpPut("{id}")] public async Task Update(Guid id, [FromBody] NavigationParameterSet parameterSet) { try { var existing = await parameterManager.GetByIdAsync(id); if (existing == null) return NotFound(new { error = $"Parameter set with ID {id} not found" }); // Validate var validation = parameterManager.Validate(parameterSet); if (!validation.IsValid) { return BadRequest(new { error = "Validation failed", errors = validation.Errors, warnings = validation.Warnings }); } existing.ControllerType = parameterSet.ControllerType; existing.PurePursuitConfig = parameterSet.PurePursuitConfig; existing.StanleyConfig = parameterSet.StanleyConfig ?? new StanleyConfig(); existing.EstimatorConfig = parameterSet.EstimatorConfig; existing.NavigationConfig = parameterSet.NavigationConfig; existing.MovePidConfig = parameterSet.MovePidConfig; existing.RotatePidConfig = parameterSet.RotatePidConfig; existing.SignalConfig = parameterSet.SignalConfig; existing.MotorDynamicsConfig = parameterSet.MotorDynamicsConfig; await parameterManager.UpdateAsync(existing); return NoContent(); } catch (Exception ex) { logger.LogError(ex, "Error updating parameter set {Id}", id); return StatusCode(500, new { error = "Failed to update parameter set" }); } } /// /// Delete parameter set /// [HttpDelete("{id}")] public async Task Delete(Guid id) { try { var existing = await parameterManager.GetByIdAsync(id); if (existing == null) return NotFound(new { error = $"Parameter set with ID {id} not found" }); await parameterManager.DeleteAsync(id); return NoContent(); } catch (Exception ex) { logger.LogError(ex, "Error deleting parameter set {Id}", id); return StatusCode(500, new { error = "Failed to delete parameter set" }); } } /// /// Validate parameter set /// [HttpPost("validate")] public ActionResult Validate([FromBody] NavigationParameterSet parameterSet) { try { var validation = parameterManager.Validate(parameterSet); return Ok(validation); } catch (Exception ex) { logger.LogError(ex, "Error validating parameter set"); return StatusCode(500, new { error = "Failed to validate parameter set" }); } } /// /// Get default preset /// [HttpGet("presets/default")] public ActionResult GetDefaultPreset() { try { var preset = parameterManager.GetDefaultPreset(); return Ok(preset); } catch (Exception ex) { logger.LogError(ex, "Error getting default preset"); return StatusCode(500, new { error = "Failed to get default preset" }); } } /// /// Get aggressive preset /// [HttpGet("presets/aggressive")] public ActionResult GetAggressivePreset() { try { var preset = parameterManager.GetAggressivePreset(); return Ok(preset); } catch (Exception ex) { logger.LogError(ex, "Error getting aggressive preset"); return StatusCode(500, new { error = "Failed to get aggressive preset" }); } } /// /// Get smooth preset /// [HttpGet("presets/smooth")] public ActionResult GetSmoothPreset() { try { var preset = parameterManager.GetSmoothPreset(); return Ok(preset); } catch (Exception ex) { logger.LogError(ex, "Error getting smooth preset"); return StatusCode(500, new { error = "Failed to get smooth preset" }); } } }