import APIClient
import AVFoundation
import PlayerUtilities

actor SnippetPlayerState {
    var isPlaying: Bool = false
    var manuallyPaused: Bool = false
    var isAttached = true
    var isReplacingCurrentItem = false
    var repeats: Bool = true
    var currentClipSnippet: ClipSnippet?
    var contentType: SnippetPlayerClient.ContentType = .hook
    private var pendingClipChangeTask: Task<Void, Never>?
    private var preloadTasks: [Task<Void, Never>] = []
    private var playbackStatusTask: Task<Void, Never>?
    private var playbackTimeTask: Task<Void, Never>?
    private var endOfTrackTask: Task<Void, Never>?

    func setCurrentClipSnippet(_ hookSnippet: ClipSnippet) async {
        currentClipSnippet = hookSnippet
    }

    func clearCurrentClipSnippet() async {
        currentClipSnippet = nil
    }

    func setIsAttached(_ attached: Bool) async {
        isAttached = attached
    }

    func setIsReplacingCurrentItem(_ replacing: Bool) async {
        isReplacingCurrentItem = replacing
    }

    func setIsPlaying(_ playing: Bool) async {
        isPlaying = playing
    }

    func setManuallyPaused(_ paused: Bool) async {
        manuallyPaused = paused
    }

    func addPreloadTask(_ task: Task<Void, Never>) async {
        preloadTasks.append(task)
    }

    func setPreloadTasks(_ tasks: [Task<Void, Never>]) async {
        preloadTasks = tasks
    }

    func clearPreloadTasks() async {
        preloadTasks.forEach { $0.cancel() }
        preloadTasks.removeAll()
    }

    func cancelPendingClipChangeTask() async {
        pendingClipChangeTask?.cancel()
        pendingClipChangeTask = nil
    }

    func setPendingClipChangeTask(_ task: Task<Void, Never>) async {
        pendingClipChangeTask?.cancel()
        pendingClipChangeTask = task
    }

    func setPlaybackStatusTask(_ task: Task<Void, Never>) async {
        playbackStatusTask?.cancel()
        playbackStatusTask = task
    }

    func cancelPlaybackStatusTask() async {
        playbackStatusTask?.cancel()
        playbackStatusTask = nil
    }

    func setPlaybackTimeTask(_ task: Task<Void, Never>) async {
        playbackTimeTask?.cancel()
        playbackTimeTask = task
    }

    func cancelPlaybackTimeTask() async {
        playbackTimeTask?.cancel()
        playbackTimeTask = nil
    }

    func setEndOfTrackTask(_ task: Task<Void, Never>) async {
        endOfTrackTask?.cancel()
        endOfTrackTask = task
    }

    func cancelEndOfTrackTask() async {
        endOfTrackTask?.cancel()
        endOfTrackTask = nil
    }

    func setRepeat(_ repeats: Bool) async {
        self.repeats = repeats
    }

    func setContentType(_ contentType: SnippetPlayerClient.ContentType) async {
        self.contentType = contentType
    }
}
