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

/// <summary>
/// Glasgow Coma Scale (GCS) scoring: latest computed score per encounter.
/// </summary>
[ApiController]
[Route("api/v1/encounters/{encounterId:guid}/gcs")]
[Produces("application/json")]
[AuthorizePermission(ClinicalPermissions.EncountersRead)]
public class GcsController : ControllerBase
{
    private readonly IGcsService _gcs;

    public GcsController(IGcsService gcs) => _gcs = gcs;

    /// <summary>
    /// Returns the latest GCS score for an encounter, or null data when no score has been computed.
    /// </summary>
    /// <param name="encounterId">Encounter id.</param>
    /// <returns>The GCS component scores and total, or null.</returns>
    [HttpGet]
    [ProducesResponseType(typeof(ApiResponse<GcsScoreResponse>), StatusCodes.Status200OK)]
    public async Task<IActionResult> Current(Guid encounterId)
    {
        var score = await _gcs.GetCurrentAsync(encounterId);
        if (score is null)
            return Ok(ApiResponse<GcsScoreResponse?>.Ok(null));

        return Ok(ApiResponse<GcsScoreResponse>.Ok(MapResponse(score)));
    }

    /// <summary>
    /// Returns cursor-paginated GCS score history for an encounter.
    /// </summary>
    /// <param name="encounterId">Encounter id.</param>
    /// <param name="limit">Maximum items per page.</param>
    /// <param name="cursor">Opaque cursor from a previous page.</param>
    /// <returns>A page of GCS scores with an optional next cursor.</returns>
    [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 _gcs.GetHistoryAsync(encounterId, limit, cursor);
        return Ok(ApiResponse<object>.Ok(new
        {
            items = page.Items.Select(MapResponse),
            nextCursor = page.NextCursor,
            hasMore = page.HasMore
        }));
    }

    private static GcsScoreResponse MapResponse(GcsScore score) =>
        new(score.EyeScore, score.VerbalScore, score.MotorScore,
            score.TotalScore, score.Classification, score.CalculatedAt);
}