import AVKit
import CoreMedia
import Foundation

import PRESTOplay

// MARK: - NetworkModule

@objc(NetworkModule)
class NetworkModule: NSObject {

    // MARK: Lifecycle

    override init() {
        super.init()
    }

    // MARK: Internal

    @objc
    func completeRequest(
        _ requestId: String,
        url: String?,
        headers headersAsJson: NSDictionary?,
        body bodyAsBase64: String?,
        resolver resolve: @escaping RCTPromiseResolveBlock,
        rejecter reject: @escaping RCTPromiseRejectBlock
    ) {
        
        if (url == nil || url == Constants.licenseUrlPlaceholder) {
            print("completeRequest: url MUST be replaced in request modifier: ", url);
            Rejecter(reject).reject(PrestoPlayError(.fatal, .drmUnsupported))
            return
        }
        
        guard let completer = Repository.shared.requestCompleters.get(key: requestId) else {
            Rejecter(reject).reject(PrestoPlayError(.fatal, .completerNotFound))
            return
        }
        if let url = url {
            completer.url = url
        }
        if let headersAsJson = headersAsJson as? [String: String] {
            completer.headers = headersAsJson
        }
        if let bodyAsBase64 = bodyAsBase64 {
            completer.body = BridgeDeserializer.toData(base64Encoded: bodyAsBase64)
        }
        completer.complete()
        resolve(nil)
    }

    @objc
    func completeResponse(
        _ responseId: String,
        headers headersAsJson: NSDictionary?,
        body bodyAsBase64: String?,
        resolver resolve: @escaping RCTPromiseResolveBlock,
        rejecter reject: @escaping RCTPromiseRejectBlock
    ) {
        guard let completer = Repository.shared.responseCompleters.get(key: responseId) else {
            Rejecter(reject).reject(PrestoPlayError(.fatal, .completerNotFound))
            return
        }
        if let headersAsJson = headersAsJson as? [String: String] {
            completer.headers = headersAsJson
        }
        if let bodyAsBase64 = bodyAsBase64 {
            completer.body = BridgeDeserializer.toData(base64Encoded: bodyAsBase64)
        }
        completer.complete()
        resolve(nil)
    }
}
