import AVFoundation
import Foundation
import CastlabsThumbnails
import PRESTOplay
import react_native_prestoplay

class ThumbnailExtension: BasePlayerExtension {
    private var delegate: ThumbnailsAPI?

    override init (player: PlayerProtocol, playerEventEmitter: PlayerEventEmitter) {
        super.init(player: player, playerEventEmitter: playerEventEmitter)
    }

    override func onContentWillLoad(
        jsonPlayerConfiguration: [String: Any]
    ) throws {
        let sideloadedTracks = try BridgeDeserializer.toSideloadedTracks(jsonPlayerConfiguration)

        guard
            let track = findThumbnailTrack(tracks: sideloadedTracks),
            let playerDelegate = player?.delegate
        else {
            return
        }

        delegate = delegate ?? PRESTOplaySDK.shared.thumbnails(for: playerDelegate)

        guard let delegate else { return }

        if
            let gridWidth = track.gridWidth,
            let gridHeight = track.gridHeight,
            let intervalMs = track.intervalMs
        {
            let gridThumbnail = GridThumbnail(
                baseUrl: track.url,
                gridHeight: gridWidth,
                gridWidth: gridHeight,
                durationMs: Int64(intervalMs)
            )

            delegate.loadThumbnailsFrom(
                gridThumbnail: gridThumbnail,
                completionHandler: nil
            )
        } else {
            delegate.loadThumbnailsFrom(
                webVTTtrack: track.url,
                completionHandler: nil
            )
        }
    }

    func getThumbnail(at positionMs: Int64) -> ThumbnailImage? {
        guard let thumbnail = delegate?.getThumbnail(
            atTimestamp: Double(positionMs) / 1000
        ) else { return nil }

        return thumbnail

    }

    private func findThumbnailTrack(tracks: [PRESTOplay.SideloadedTrack]?) -> SideloadedTrack? {
        return tracks?.first(where: { $0.trackType == .thumbnail })
    }
}
