using Campaign_Tracker.Server.Authorization; using Campaign_Tracker.Server.Municipalities; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Campaign_Tracker.Server.Controllers; [ApiController] [Authorize(Policy = ApplicationPolicy.ClientServicesAccess)] [Route("api/municipalities/{profileId}/prior-cycle-defaults")] public sealed class MunicipalityPriorCycleDefaultsController : ControllerBase { private const string EmptyMessage = "No prior cycle defaults available."; private readonly IMunicipalityProfileRepository _profiles; private readonly IMunicipalityPriorCycleDefaultsRepository _defaults; public MunicipalityPriorCycleDefaultsController( IMunicipalityProfileRepository profiles, IMunicipalityPriorCycleDefaultsRepository defaults) { _profiles = profiles; _defaults = defaults; } [HttpGet] public async Task> Get( string profileId, CancellationToken cancellationToken) { var profile = await _profiles.GetByIdAsync(profileId, cancellationToken); if (profile is null) return NotFound(); var cycles = await _defaults.GetByJCodeAsync( profile.Profile.JCode, cancellationToken); var responseCycles = cycles .Select(PriorCycleResponse.From) .ToArray(); return Ok(new MunicipalityPriorCycleDefaultsResponse( ProfileId: profileId, HasPriorCycles: responseCycles.Length > 0, SelectedCycleId: responseCycles.FirstOrDefault()?.CycleId, EmptyStateMessage: responseCycles.Length == 0 ? EmptyMessage : string.Empty, Cycles: responseCycles)); } } public sealed record MunicipalityPriorCycleDefaultsResponse( string ProfileId, bool HasPriorCycles, string? SelectedCycleId, string EmptyStateMessage, IReadOnlyList Cycles); public sealed record PriorCycleResponse( string CycleId, string CycleName, string CompletedAt, IReadOnlyList Services) { public static PriorCycleResponse From(MunicipalityPriorCycleDefaults cycle) => new( cycle.CycleId, cycle.CycleName, cycle.CompletedAt.ToString("O"), cycle.Services.Select(PriorCycleServiceResponse.From).ToArray()); } public sealed record PriorCycleServiceResponse( string ServiceType, string Summary, IReadOnlyDictionary Values) { public static PriorCycleServiceResponse From(MunicipalityPriorCycleServiceDefault service) => new(service.ServiceType, service.Summary, service.Values); }