//
// Copyright (c) Double Symmetry GmbH
// Commercial use requires a license. See https://rntp.dev/pricing
//

import Foundation

enum EnginePlaybackState {
  case playing
  case paused
  case waitingToPlay
}

struct StreamMetadata: Equatable {
  let title: String?
  let artist: String?
  let albumTitle: String?
  let artworkUri: String?
  let genre: String?

  var isEmpty: Bool {
    title == nil && artist == nil && albumTitle == nil && artworkUri == nil && genre == nil
  }
}

protocol PlayerEngine: AnyObject {
  var currentTime: Double { get }
  var duration: Double { get }
  var bufferedPosition: Double { get }
  var cachedPosition: Double { get }
  var defaultRate: Float { get set }
  var currentRate: Float { get set }
  var volume: Float { get set }
  var isPlaying: Bool { get }
  var hasCurrentItem: Bool { get }

  var onPlaybackStateChange: ((EnginePlaybackState) -> Void)? { get set }
  var onItemReady: (() -> Void)? { get set }
  var onItemFailed: ((_ code: String, _ message: String) -> Void)? { get set }
  var onItemPlayedToEnd: (() -> Void)? { get set }
  var onDurationChange: (() -> Void)? { get set }
  var onTimedMetadata: ((_ metadata: StreamMetadata) -> Void)? { get set }
  var onAssetMetadata: ((_ metadata: StreamMetadata) -> Void)? { get set }

  func play()
  func pause()
  func load(url: URL, headers: [String: String]?, isLive: Bool)
  func seek(to seconds: TimeInterval, completion: @escaping (Bool) -> Void)
  func reset()
}
