using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Jellyfin.Plugin.SRFPlay.Api.Models;
using Jellyfin.Plugin.SRFPlay.Api.Models.PlayV3;

namespace Jellyfin.Plugin.SRFPlay.Services.Interfaces;

/// <summary>
/// Service for managing sport livestream recordings.
/// </summary>
public interface IRecordingService
{
    /// <summary>
    /// Gets upcoming sport livestreams that can be recorded.
    /// </summary>
    /// <param name="cancellationToken">The cancellation token.</param>
    /// <returns>List of upcoming sport livestreams.</returns>
    Task<IReadOnlyList<PlayV3TvProgram>> GetUpcomingScheduleAsync(CancellationToken cancellationToken = default);

    /// <summary>
    /// Schedules a livestream for recording.
    /// </summary>
    /// <param name="urn">The SRF URN to record.</param>
    /// <param name="cancellationToken">The cancellation token.</param>
    /// <returns>The created recording entry.</returns>
    Task<RecordingEntry> ScheduleRecordingAsync(string urn, CancellationToken cancellationToken = default);

    /// <summary>
    /// Cancels a scheduled recording.
    /// </summary>
    /// <param name="recordingId">The recording ID.</param>
    /// <returns>True if cancelled.</returns>
    bool CancelRecording(string recordingId);

    /// <summary>
    /// Stops an active recording.
    /// </summary>
    /// <param name="recordingId">The recording ID.</param>
    /// <returns>True if stopped.</returns>
    bool StopRecording(string recordingId);

    /// <summary>
    /// Gets all recordings by state.
    /// </summary>
    /// <param name="stateFilter">Optional state filter.</param>
    /// <returns>List of matching recording entries.</returns>
    IReadOnlyList<RecordingEntry> GetRecordings(RecordingState? stateFilter = null);

    /// <summary>
    /// Deletes a completed recording (entry and optionally the file).
    /// </summary>
    /// <param name="recordingId">The recording ID.</param>
    /// <param name="deleteFile">Whether to delete the file too.</param>
    /// <returns>True if deleted.</returns>
    bool DeleteRecording(string recordingId, bool deleteFile = true);

    /// <summary>
    /// Checks scheduled recordings and starts/stops them as needed.
    /// Called periodically by the scheduler task.
    /// </summary>
    /// <param name="cancellationToken">The cancellation token.</param>
    /// <returns>A task representing the async operation.</returns>
    Task ProcessRecordingsAsync(CancellationToken cancellationToken = default);
}
