using Dto.Tiny; using Microsoft.AspNetCore.Mvc; namespace HeartTrackAPI.Controllers; [ApiController] [ApiVersion("1.0")] [Route("api/[controller]")] public class AnalysisController : ControllerBase { private readonly List _heartRateZones = new() { new() { Name = "Repos", MinHeartRate = 0, MaxHeartRate = 60 }, new() { Name = "Aérobie légère", MinHeartRate = 61, MaxHeartRate = 90 }, new() { Name = "Aérobie", MinHeartRate = 91, MaxHeartRate = 140 }, new() { Name = "Anaérobie", MinHeartRate = 141, MaxHeartRate = 180 }, new() { Name = "VO2 Max", MinHeartRate = 181, MaxHeartRate = 220 } }; [HttpGet("heart-rate/zones")] public IActionResult GetHeartRateZones() { var heartRates = GetMockHeartRateData(); var results = _heartRateZones.Select(zone => new HeartRateZoneResult { Zone = zone.Name, TimeSpent = CalculateTimeInZone(zone, heartRates) }).ToList(); return Ok(results); } private TimeSpan CalculateTimeInZone(HeartRateZone zone, List heartRates) { var secondsInZone = heartRates.Count(hr => hr.HeartRate >= zone.MinHeartRate && hr.HeartRate <= zone.MaxHeartRate); return TimeSpan.FromSeconds(secondsInZone); } private List GetMockHeartRateData() { var random = new Random(); return Enumerable.Range(1, 3600) .Select(_ => new HeartRateTinyDto { HeartRate = random.Next(60, 220), Timestamp = new DateTime(2021, 1, 1).AddSeconds(random.Next(3600)), Latitude = random.NextDouble() * 180 - 90, Longitude = random.NextDouble() * 360 - 180, Altitude = random.NextDouble() * 1000, Cadence = random.Next(60, 120), Distance = random.NextDouble() * 100, Speed = random.NextDouble() * 30, Power = random.Next(0, 500), Temperature = random.NextDouble() * 30 }).ToList(); } } public class HeartRateZoneResult { public string Zone { get; set; } public TimeSpan TimeSpent { get; set; } } internal class HeartRateZone { public string Name { get; set; } public int MinHeartRate { get; set; } public int MaxHeartRate { get; set; } }