using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

/// <summary>
/// qSOFA scoring: current active criteria count per encounter (Redis-backed).
/// </summary>
[ApiController]
[Route("api/v1/encounters/{encounterId:guid}/qsofa")]
[Produces("application/json")]
[AuthorizePermission(ClinicalPermissions.EncountersRead)]
public class QsofaController : ControllerBase
{
    private readonly IQsofaService _qsofa;

    public QsofaController(IQsofaService qsofa) => _qsofa = qsofa;

    /// <summary>
    /// Returns the current qSOFA active criteria count (0–3) for an encounter.
    /// </summary>
    [HttpGet("current")]
    [ProducesResponseType(typeof(ApiResponse<QsofaCurrentResponse>), StatusCodes.Status200OK)]
    [ProducesResponseType(typeof(ApiResponse<object>), StatusCodes.Status404NotFound)]
    public async Task<IActionResult> Current(Guid encounterId)
    {
        var score = await _qsofa.GetCurrentAsync(encounterId);
        return Ok(ApiResponse<QsofaCurrentResponse>.Ok(score));
    }

    /// <summary>
    /// Returns cursor-paginated qSOFA alert history for an encounter.
    /// </summary>
    [HttpGet("history")]
    [ProducesResponseType(typeof(ApiResponse<object>), StatusCodes.Status200OK)]
    public async Task<IActionResult> History(
        Guid encounterId,
        [FromQuery] int limit = 20,
        [FromQuery] string? cursor = null)
    {
        var page = await _qsofa.GetHistoryAsync(encounterId, limit, cursor);
        return Ok(ApiResponse<object>.Ok(new
        {
            items = page.Items.Select(e => new QsofaHistoryResponse(
                e.ActiveCriteria,
                QsofaCalculator.ParseCriteriaState(e),
                e.ScreenAlertFired,
                e.EvaluatedAt)),
            nextCursor = page.NextCursor,
            hasMore = page.HasMore
        }));
    }
}
