using System.Threading;
using Jellyfin.Plugin.SRFPlay.Api.Models;
using Jellyfin.Plugin.SRFPlay.Services.Interfaces;
using MediaBrowser.Common.Api;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace Jellyfin.Plugin.SRFPlay.Controllers;

/// <summary>
/// Administrative maintenance actions for the SRF Play plugin.
/// </summary>
[ApiController]
[Route("Plugins/SRFPlay/Maintenance")]
[Authorize(Policy = Policies.RequiresElevation)]
public class MaintenanceController : ControllerBase
{
    private readonly ILogger<MaintenanceController> _logger;
    private readonly IResumeCleanupService _resumeCleanupService;

    /// <summary>
    /// Initializes a new instance of the <see cref="MaintenanceController"/> class.
    /// </summary>
    /// <param name="logger">The logger.</param>
    /// <param name="resumeCleanupService">The resume cleanup service.</param>
    public MaintenanceController(
        ILogger<MaintenanceController> logger,
        IResumeCleanupService resumeCleanupService)
    {
        _logger = logger;
        _resumeCleanupService = resumeCleanupService;
    }

    /// <summary>
    /// Clears stale SRF Play resume points from every user's "Continue Watching" row.
    /// </summary>
    /// <param name="clearAll">
    /// When true, clears every SRF Play resume point instead of only the stale ones.
    /// </param>
    /// <param name="cancellationToken">The cancellation token.</param>
    /// <returns>A summary of what was inspected and cleared.</returns>
    [HttpPost("ResumePoints/Cleanup")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public ActionResult<ResumeCleanupResult> CleanupResumePoints(
        [FromQuery] bool clearAll,
        CancellationToken cancellationToken)
    {
        _logger.LogInformation("Manual Continue Watching cleanup requested (clearAll: {ClearAll})", clearAll);
        return Ok(_resumeCleanupService.Cleanup(clearAll, cancellationToken));
    }
}
