import AVFoundation
import SwiftUI

public struct AssetCreationPlayerManager: Equatable {
    private static var sharedPlayer: AVPlayer?

    private var player: AVPlayer? {
        get {
            return AssetCreationPlayerManager.sharedPlayer
        }
        set {
            AssetCreationPlayerManager.sharedPlayer = newValue
        }
    }

    public var isPlaying: Bool {
        guard let player else { return false }
        return player.rate != 0
    }

    public init() {
        let avPlayer: AVPlayer
        if let shared = player {
            avPlayer = shared
        } else {
            avPlayer = AVPlayer()
            player = avPlayer
        }
    }

    public func setURL(_ url: URL) {
        let playerItem = AVPlayerItem(url: url)
        player?.replaceCurrentItem(with: playerItem)
    }

    public func play() {
        player?.play()
    }

    public func pause() {
        player?.pause()
    }

    public func playAtTime(_ time: CMTime) async {
        await player?.seek(to: time)
        if !isPlaying {
            player?.play()
        }
    }

    public func stop() {
        player?.pause()
        player?.replaceCurrentItem(with: nil)
        AssetCreationPlayerManager.sharedPlayer = nil
    }
}
